Layui transfer组件不提供moveToRight等手动移动API,左右移动仅由按钮点击驱动;需确保data中value为字符串、初始化value为字符串数组、禁用disabled项,并通过transfer.set()动态更新右侧数据。

layui 的 transfer 组件本身不提供「手动触发左右移动」的 API,左右数据转移完全由用户点击箭头按钮(→ / ←)驱动,底层逻辑是自动维护 value 数组。你不能像操作普通数组那样调用 moveToRight() 或 moveToLeft() —— 这些函数在 layui 里根本不存在。
怎么让左侧选中项点「→」后真正移到右侧
核心是确保配置合法、数据结构匹配、且没被意外拦截:
-
data数组每项必须含value字段,且值为字符串(如"1"),不能是数字1,否则移动后value不匹配,右侧不显示 -
value配置项(初始化时右侧默认值)必须是字符串数组,例如["2", "4"],写成[2, 4]会导致右侧为空 - 别在
onchange回调里同步修改 DOM 或重 render —— 这会打断组件内部状态,导致按钮点击无响应 - 如果用了
disabled: true,该项永远无法被选中和移动,哪怕它出现在value初始数组里,也会被静默忽略
如何动态更新右侧已选中的数据(比如从接口拉新数据后重置)
不能改配置对象再 rerender,必须用 transfer.set():
- 初始化时必须显式传
id,例如id: 'userTransfer',后续set()才能定位到实例 -
transfer.set('userTransfer', ['3', '5', '7'])—— 第二个参数必须是字符串数组,且每个值都得在原始data的value字段中存在 - 调用
set()后,右侧列表立即更新,但onchange不会触发(它只响应用户点击) - 如果原始
data里某条有disabled: "true",即使你把它塞进set()的数组,也不会出现在右侧
为什么点了「→」按钮但右侧没变化
常见原因不是 JS 报错,而是状态不一致或 DOM 干扰:
- 检查浏览器控制台是否有
transfer is not defined—— 没正确layui.use('transfer')或模块未加载完成就调用 - 确认你没给穿梭框容器(如
#test)额外加display: none或visibility: hidden,这会导致内部 checkbox 失去 focus/checked 状态跟踪 - 如果页面用 jQuery 动态插入了穿梭框 DOM,必须等
transfer.render()完全执行完再操作,不能插在$(...).html(...)后立刻 render - 自定义样式覆盖了
.layui-transfer-item input的position或z-index,导致 checkbox 实际不可点(看起来能点,但 click 事件没冒泡到组件逻辑)
最易被忽略的一点:layui 的 transfer 是基于 jQuery 的 DOM 事件委托实现的,所有交互依赖原始渲染生成的 input[type="checkbox"] 元素。一旦你用 v-html、innerHTML 或第三方框架强行替换过内部结构,移动功能必然失效——它不是纯数据驱动,而是强绑定初始 DOM。


















