Skip to content

Transfer 穿梭框 ​

左右双面板 + 中间穿梭按钮,支持搜索过滤、键盘操作、目标侧拖拽排序与选中即移动模式。

基础用法 ​

基础

面板头显示「已选/可见」计数(如 1/3),随勾选与过滤实时更新。

预置选中值与标题 ​

预置 value + titles

可搜索 ​

searchable

区分大小写搜索 ​

searchable + case-sensitive

单向模式 ​

只能从左向右穿梭,右侧只读;左侧展示全部数据,已穿梭项禁用并显示为已选。

one-way

目标顺序与拖拽排序 ​

target-sort 控制右面板顺序策略:

  • original(默认):保持数据源顺序(与 data 一致)
  • push:新穿梭项追加到尾部
  • unshift:新穿梭项依次插入头部

target-draggable 开启右面板拖拽排序(顺序即业务含义的「已选清单」场景);触屏(pointer: coarse)与键盘可达的替代通道:行内「上移/下移」按钮(点击移一位),键盘先点选右侧某行 Alt + ↑/↓ 移动其位置。original 模式顺序由数据源决定,拖拽与排序按钮均不生效——需要手动排序时请配 push / unshift。

target-sort=push + target-draggable(行内上移/下移按钮 + 拖拽)

target-sort=unshift(新穿梭项置顶)

选中即移动(simple) ​

simple 开启后点击行立即穿梭(免中央按钮,触屏友好),中央按钮隐藏;默认关闭,维持「选完点按钮」的主形态。

窄屏(视口 ≤480px)下双面板自动纵向堆叠、穿梭按钮改横排居中,不再保持 180px×2 的刚性宽度;触屏(pointer: coarse)下选项行高与穿梭按钮热区自动抬到 44px。

simple

行自定义(item 插槽) ​

template[slot="item"] 克隆进每行(静态与虚拟滚动面板一致),[data-item-label] 自动绑定选项文本:

item 插槽(角色图标 + 富文本行)

空态自定义(empty 插槽) ​

template[slot="empty"] 自定义空态(真空态与搜索无匹配态共用,双侧共用):

empty 插槽

虚拟滚动 ​

万级数据窗口化渲染,滚动流畅,选中态 / 全选 / 键盘导航保持。

virtual(10000 项,item-height 32)

长列表分页(pagination) ​

pagination 开启面板内分页(page-size 每页条数,默认 10):左右面板各自独立翻页,面板底部出现简版页脚(上一页 / 页码 / 下一页,边界自动禁用)。分页作用于搜索过滤之后的可见项;过滤词变化页码重置回第 1 页;面板头计数仍按全量可见统计。虚拟模式自窗口化,两者并存时分页不生效。

pagination + page-size=2

列表滚动事件(oas-scroll) ​

面板列表滚动时派发 oas-scroll(静态列表与虚拟视口均生效),detail: { side, direction, scrollTop, reachBottom }——懒加载通道:宿主监听 reachBottom 追加数据到 data 即可。

滚动反馈(reachBottom 提示)

禁用 ​

disabled 禁用整组交互(行/全选/搜索/穿梭按钮/键盘),并镜像宿主 data-disabled 供样式消费;disabled-skip 豁免全局禁用注入。

disabled(查看态回显)

事件 ​

变化事件

选中与搜索事件

  • oas-change:穿梭后值变化,detail: { value }
  • oas-select-change:面板选中集变化(点行 / 全选 / 键盘选中均派发),detail: { side: 'left' | 'right', selected: string[] }
  • oas-search:搜索输入,detail: { side, query }
  • oas-scroll:面板列表滚动,detail: { side, direction: 'up' | 'down', scrollTop, reachBottom }(懒加载通道)

键盘操作 ​

按键行为
↑ / ↓移动选中(单选语义的导航态)
Enter穿梭当前选中项
Space切换当前选中项勾选
Ctrl/⌘ + A全选/全清当前面板可见可选项
Alt + ↑/↓右面板排序(target-draggable 的键盘替代,需先选中一行)

树形数据穿梭(oas-tree 组合示例) ​

树形 / 表格式穿梭不进组件数据协议,用 oas-tree(勾选)+ transfer(value 联动)组合达成:

部门树选人(oas-tree + transfer 联动)

表格式穿梭(多列信息)同理:宿主用 oas-table 渲染左侧数据,勾选变化时把 key 集合同步给 transfer 的 value。

API ​

oas-transfer ​

属性 ​

属性说明类型默认值
case-sensitive搜索区分大小写(默认大小写不敏感)boolean—
data数据(JSON attribute 声明式通道,property 赋值单向反射,[{ key, label, disabled }])TransferItem[] | string[]
disabled禁用(行点击/按钮/搜索全部失效;宿主镜像 data-disabled)boolean—
item-height虚拟滚动每行固定高度(px),默认 36string—
one-way单向模式:只能左→右移动,右侧只读;左侧展示全部数据,已穿梭项禁用并显示为已选boolean—
page-size每页条数(非法/小于 1 回落 10)string10
pagination长列表分页:双面板独立翻页 + 简版页脚(作用于过滤后可见项)boolean—
searchable面板内搜索过滤(左右各自过滤)boolean—
simple选中即移动(免点穿梭按钮,默认关)boolean—
source-title左面板标题——
target-draggable目标侧拖拽排序(需配 target-sort=push/unshift;original 模式顺序由数据源决定不启用)boolean—
target-sort目标侧排序:original(默认,按数据源序)/ push(依次入尾)/ unshift(依次插头)。⚠️ 注意 value 数组顺序语义:original 下乱序预置 value 会被归一到数据源序stringoriginal
target-title右面板标题——
titles双面板标题(JSON 数组)或 source-title/target-titlestring—
value已选 key 数组(JSON 属性)string[] | string[]
virtual大数据量窗口化渲染(虚拟滚动,行高默认 36px)boolean—

Property(JS property;是否写回 attribute 见各行说明) ​

Property说明类型默认值
value当前值:目标侧 key 数组string[] | string—

事件 ​

事件说明
oas-change穿梭后值变化,detail: { value }
oas-scroll列表滚动事件,detail: { side, direction, scrollTop, reachBottom }(懒加载通道)
oas-search面板搜索输入,detail: { side, query }
oas-select-change选中集合变化(点行/全选/键盘),detail: { side, selected }

插槽 ​

名称说明
template[slot="empty"]空态与无匹配共用自定义内容
template[slot="item"]自定义行([data-item-label] 绑定,静态+虚拟行一致)

键盘:聚焦面板列表后 ↑/↓ 移动选中,Enter 穿梭。

基于 MIT OR Apache-2.0 双许可发布