Skip to content

Transfer 穿梭框

穿梭框提供两个并排的面板,用户可以将选项从一个列表移动到另一个列表,常用于权限分配、角色关联等场景。


基础用法

通过 :data 传入选项列表,v-model 绑定已选中的 key 数组。选项中的 disabled 属性可禁用该选项。

vue

<script setup>
interface Option {
  key: number
  label: string
  disabled?: boolean
}

const data = ref<Option[]>(
  Array.from({ length: 15 }, (_, i) => ({
    key: i + 1,
    label: `选项 ${i + 1}`,
    disabled: (i + 1) % 4 === 0,
  }))
)
const value = ref<number[]>([])
</script>

<TTransfer v-model="value" :data="data" />

带初始值

v-model 赋予初始值数组,右侧面板默认包含指定项。

vue

<TTransfer v-model="value" :data="data" />
ts
// 初始选中 key 为 2, 4, 6, 8 的项
const value = ref<number[]>([2, 4, 6, 8])

可搜索过滤

设置 filterable 属性开启搜索过滤。默认按 label 字段匹配,也可通过 filter-method 自定义逻辑。

vue

<TTransfer v-model="value" :data="data" filterable />

保留源列表模式

设置 keep-source 属性,左侧列表所有项始终可见。已移入右侧的项在左侧显示为已勾选+禁用状态,移回后恢复可选。

vue

<TTransfer v-model="value" :data="data" keep-source />

API

Props

属性类型默认值说明
dataTransferOption[][]全部选项列表
model-value / v-model(string | number)[][]已选中的 key 数组
filterablebooleanfalse是否可搜索过滤
filter-method(query: string, option: TransferOption) => boolean自定义过滤函数
filter-placeholderstring'搜索'搜索框占位文本
left-titlestring'待选列表'左侧面板标题
right-titlestring'已选列表'右侧面板标题
empty-textstring'暂无数据'空数据提示文本
keep-sourcebooleanfalse保留源列表模式:左侧列表始终展示全部项,已移入右侧的显示为勾选+禁用

TransferOption

字段类型说明
keystring | number唯一标识
labelstring显示文本
disabledboolean是否禁用

Slots

插槽参数说明
default{ item: TransferOption, checked: boolean }自定义列表项渲染内容