Skip to content
API 风格:

Transfer ​

Two-panel list with checked moving; partitioning and moves are immutable pure core functions. Both panels are role="listbox" (APG listbox pattern).

Basic usage ​

Basic
1 / 3
  • A
2 / 3
  • B
  • C
vue
<script setup>
import { ref } from 'vue'
const source = ref(['a'])
const items = [
  { key: 'a', label: 'A' },
  { key: 'b', label: 'B' },
  { key: 'c', label: 'C', disabled: true },
]
</script>

<template>
  <LhTransfer :data="items" v-model="source" />
</template>
vue
<script>
export default {
  data() {
    return {
      source: ['a'],
      items: [
        { key: 'a', label: 'A' },
        { key: 'b', label: 'B' },
        { key: 'c', label: 'C', disabled: true },
      ],
    }
  },
}
</script>

<template>
  <LhTransfer :data="items" v-model="source" />
</template>

Disabled ​

disabled disables the whole transfer.

Disabled transfer
1 / 3
  • A
2 / 3
  • B
  • C
vue
<script setup lang="ts">
import { ref } from 'vue'

const source = ref(['a'])
const items = [
  { key: 'a', label: 'A' },
  { key: 'b', label: 'B' },
  { key: 'c', label: 'C', disabled: true },
]
</script>

<template>
  <LhTransfer :data="items" v-model="source" disabled />
</template>
vue
<script>
export default {
  data() {
    return {
      source: ['a'],
      items: [
        { key: 'a', label: 'A' },
        { key: 'b', label: 'B' },
        { key: 'c', label: 'C', disabled: true },
      ],
    }
  },
}
</script>

<template>
  <LhTransfer :data="items" v-model="source" disabled />
</template>

API ​

LhTransfer Props ​

AttributeDescriptionTypeDefault
dataFull data source[LhTransferItem](#type-LhTransferItem)[]—
modelValueSource (left) key list(string | number)[]() => []
disabledDisabledbooleanfalse
sxQuick layout propsLhSxProps—

LhTransfer Events ​

EventDescriptionCallback
update:modelValueEmitted when the target (right) key list changes (use with v-model)(keys: Array<string | number>) => void
changeEmitted after items are moved(keys: Array<string | number>, direction: 'left-to-right' | 'right-to-left') => void

LhTransferItem ​

FieldDescriptionType
keyUnique keystring | number
labelDisplay textstring
disabledDisabled (cannot move)boolean

Accessibility ​

  • Both panels are role="listbox" + aria-multiselectable; items are role="option" with aria-selected / aria-disabled
  • Move buttons are named real <button>s; check-all is a native checkbox with a real indeterminate state
  • Each panel has its own labelled search box; disabled items are blocked at every layer

Type Definitions ​

The TypeScript type structures exported by this component (auto-extracted from packages/components/transfer/src/types.ts and @lh-ui/share/core/* sources; click each entry to expand; see the Props table above for attribute descriptions):

LhTransferProps
ts
export interface LhTransferProps {
  data: LhTransferItem[]
  modelValue?: Array<string | number>
  disabled?: boolean
  sx?: LhSxProps
}
LhTransferSide (from @lh-ui/share/core/transfer)
ts
export type LhTransferSide = 'left' | 'right'
LhTransferItem (from @lh-ui/share/core/transfer)
ts
export interface LhTransferItem {
  key: string | number
  label: string
  disabled?: boolean
}

Beauty of tradition, foundation of code