Transfer 穿梭框
在两栏中移动选项元素,完成数据的转移操作。
基础用法
列表一0/6
选项 B
选项 D
选项 E
选项 F
选项 G
选项 H
列表二0/2
选项 A
选项 C
右侧值:a, c
vue
<my-transfer v-model="value" :data="data" />
const data = [
{ key: 'a', label: '选项 A' },
{ key: 'b', label: '选项 B' },
{ key: 'c', label: '选项 C' },
{ key: 'd', label: '选项 D' },
]可搜索过滤
filterable 开启搜索过滤,快速定位选项。
列表一0/10
北京
上海
广州
深圳
杭州
成都
武汉
南京
西安
重庆
列表二0/0
暂无数据
右侧值:空
vue
<my-transfer v-model="value" :data="data" filterable />自定义标题
通过 titles 属性自定义左右面板标题。
未选城市0/8
选项 A
选项 B
选项 C
选项 D
选项 E
选项 F
选项 G
选项 H
已选城市0/0
暂无数据
vue
<my-transfer v-model="value" :data="data" :titles="['未选城市', '已选城市']" filterable />自定义内容
通过 #item 插槽自定义每个选项的渲染。
列表一0/8
选项 A a
选项 B b
选项 C c
选项 D d
选项 E e
选项 F f
选项 G g
选项 H h
列表二0/0
暂无数据
vue
<my-transfer v-model="value" :data="data">
<template #item="{ item, side }">
<span :style="{ color: side === 'right' ? 'green' : '' }">
{{ item.label }}
</span>
</template>
</my-transfer>自定义空内容
通过 #empty 插槽自定义无数据时的提示内容。
自定义空状态
可选0/0
暂无可用数据
已选0/0
暂无可用数据
vue
<my-transfer v-model="value" :data="[]">
<template #empty>
<div style="text-align:center">
<svg>...</svg>
<p>暂无可用数据</p>
</div>
</template>
</my-transfer>数据项属性别名
propsAlias 将自定义字段映射到 key、label、disabled。
源数据0/8
Alpha
Beta
Gamma
Delta
Epsilon
Zeta
Eta
Theta
目标数据0/0
暂无数据
vue
<my-transfer v-model="value" :data="data" :propsAlias="{ key: 'id', label: 'name' }" />
const data = [
{ id: 'a1', name: 'Alpha' },
{ id: 'b2', name: 'Beta' },
{ id: 'c3', name: 'Gamma' },
]组件结构
根元素 .my-transfer 横向排列:左侧面板 + 中间操作按钮区 + 右侧面板。每个面板包含头部、可选的搜索框、选项列表。
CSS 类名
| 类名 | 说明 |
|---|---|
.my-transfer | 根元素 |
.my-transfer__panel | 左/右面板 |
.my-transfer__header | 面板头部 |
.my-transfer__count | 已选计数 |
.my-transfer__filter | 搜索过滤区域 |
.my-transfer__filter-input | 搜索输入框 |
.my-transfer__list | 选项列表容器 |
.my-transfer__item | 选项行 |
.my-transfer__item.is-checked | 已勾选状态 |
.my-transfer__check | 复选框容器 |
.my-transfer__check-box | 复选框 |
.my-transfer__check-box.is-checked | 已勾选状态 |
.my-transfer__label | 选项标签文本 |
.my-transfer__empty | 无数据提示 |
.my-transfer__actions | 中间操作按钮区 |
API
Transfer Props
| 属性 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| modelValue | 右侧选中的 key 数组 (v-model) | (string | number)[] | [] |
| data | 数据源 | TransferItem[] | [] |
| titles | 左右面板标题 | [string, string] | ['列表一', '列表二'] |
| filterable | 可搜索过滤 | boolean | false |
| filterPlaceholder | 搜索框占位文字 | string | '请输入关键词' |
| propsAlias | 字段别名映射 | { key?, label?, disabled? } | — |
Transfer Events
| 事件 | 说明 | 回调 |
|---|---|---|
| update:modelValue | 值变更 | (value: (string | number)[]) |
| change | 右侧值变更 | (value: (string | number)[]) |
| left-check-change | 左侧勾选项变化 | (keys: (string | number)[]) |
| right-check-change | 右侧勾选项变化 | (keys: (string | number)[]) |
Transfer Slots
| 名称 | 说明 | 作用域 |
|---|---|---|
| item | 自定义选项内容 | { item, side } |
| empty | 自定义空内容(两侧共用) | — |
| empty-left | 自定义左侧空内容 | — |
| empty-right | 自定义右侧空内容 | — |
TransferItem
ts
interface TransferItem {
key: string | number
label: string
disabled?: boolean
[key: string]: any
}