Element Plus穿梭框数据怎么总是不同步? 码农文君 提问于 2026-02-08 16:34:38 阅读 55 组件 用Element Plus的Transfer组件做数据迁移时,选中的项在左右切换后数据没及时更新,页面显示和实际数据不一致。试过用v-model绑定数据数组,但点击按钮后数据还是没变化。 代码结构大概是这样的: <el-transfer v-model="selected" :data="items" :titles="['可选', '已选']" /> 数据初始化没问题,但操作后selected数组一直没变化。控制台也没报错,是不是漏了什么事件监听? UI组件Vue组件主题定制 我来解答 赞 16 收藏 分享 生成中... 手机扫码查看 复制链接 生成海报 反馈 发表解答 您需要先 登录/注册 才能发表解答 2 条解答 ❤静怡 Lv1 我之前踩过这个坑,你这问题八成是搞混了 v-model 绑定的数据结构。 el-transfer 的 v-model 绑定的不是选中项的数组内容,而是绑定的“右侧面板的 key 值数组”。也就是说 selected 必须是一个 number 或 string 类型的数组,里面存的是 data 里每一项的 key 值。 你的 items 数据是不是长这样? items = [ { key: 1, label: '选项1' }, { key: 2, label: '选项2' } ] 那 selected 初始得是空数组: selected = [] 操作后如果右边有两项,selected 就变成 [1, 2],而不是把整个对象塞进去。 重点来了:如果你的 items 里没有提供 key 字段,el-transfer 会拿 index 当 key,这就容易出问题,数据看着没变,其实是 key 对不上导致同步失败。 解决办法三个: 第一,确保每个 item 都有唯一 key 和 label 第二,v-model 绑定的 selected 是 key 的数组,别往里面 push 对象 第三,别手动改 selected,让组件自己更新,要用响应式 如果你非要监听变化,用 watch 监听 selected 就行,别去动 data 源头。 说白了就是一句话:v-model 控的是右边有哪些 key,不是哪些数据。搞清楚这个,基本就通了。 回复 点赞 5 2026-02-12 16:02 ლ熙炫 Lv1 你这个情况我之前也遇到过,其实是对 v-model 绑定的数据格式理解有点偏差。Element Plus 的 Transfer 组件虽然用了 v-model,但它绑定的不是简单的数组,而是选中项的 key 数组,而且每个 item 必须有唯一的 key 值。 首先确保你的 items 数据长这样: items = [ { key: 1, label: '选项1' }, { key: 2, label: '选项2' }, { key: 3, label: '选项3' } ] 然后 selected 应该是一个存放 key 的数组,比如: selected = [1, 3] 如果你初始化的时候 items 是从接口拿的,很可能 key 字段没加上,或者数据结构不对,导致组件没法正确追踪选中状态。 我的做法是:在获取到原始数据后,立刻用 map 处理一遍,补全 key 和 label this.items = res.data.map(item => ({ key: item.id, label: item.name })) 另外注意 v-model 绑定的 selected 一定要定义在 data 返回的对象里,不能漏掉。如果还是不更新,可以监听 change 事件看看有没有触发 <el-transfer v-model="selected" :data="items" :titles="['可选', '已选']" @change="handleChange" /> 在 handleChange 里打个 console.log,确认是不是真的没变化。大概率是你 items 缺少 key 导致组件无法正确响应。 回复 点赞 1 2026-02-09 03:05 加载更多 相关推荐 1 回答 32 浏览 Element Plus 表格开启虚拟滚动后数据不显示怎么办? 我用 Element Plus 的 Table 组件加了虚拟滚动,但表格直接空白了,数据明明有啊。试过设置 height 和 max-height,也按文档加了 virtual-scroll 属性,还... 风云 ☘︎ 组件 2026-03-30 10:15:14 2 回答 30 浏览 Element Plus骨架屏怎么动态控制显示和隐藏? 我用Element Plus的Skeleton做加载占位,但不知道怎么在数据加载完后自动隐藏它。试了v-if绑定loading状态,但骨架屏一闪就没了,体验不好。 这是我的代码: <templa... 码农玉戈 组件 2026-03-04 13:08:25 2 回答 33 浏览 Element Plus级联选择器怎么动态设置默认值? 我用Element Plus的Cascader做地区选择,数据是异步从接口拿的。但我想在编辑页面时回显已保存的路径(比如['110000', '110100', '110101']),试了直接给mod... 远香 组件 2026-03-25 09:08:18 2 回答 55 浏览 Element Plus折叠面板怎么默认展开指定项? 我用Element Plus的Collapse组件做了一个FAQ列表,但不知道怎么让其中某一项默认展开。文档里说可以用v-model绑定激活的面板,但我试了好像没生效,页面加载时还是全部收起的。 我绑... Mr-自立 组件 2026-03-16 22:02:27 1 回答 40 浏览 Element Plus 的 Loading 加载怎么在表格上局部生效? 我在用 Element Plus 的 el-table,想在数据加载时只给表格加 loading,但一加上整个页面都灰了,这是为啥? 我试过这样写: <el-table v-loading="l... 正利 ☘︎ 组件 2026-03-07 23:29:18 1 回答 33 浏览 Element Plus 的 Statistic 组件怎么自定义前缀和后缀样式? 我用 Element Plus 的 Statistic 组件展示数据,但默认的前缀(比如“¥”)和后缀(比如“元”)样式太小了,想改大一点,试了加 class 好像没生效? 我在文档里看到有 pref... 弯弯 组件 2026-02-26 23:17:21 2 回答 59 浏览 Element Plus时间线怎么自定义节点图标? 我用Element Plus的Timeline组件,想把默认的圆点换成自定义图标,但文档里没看懂怎么弄。试了在el-timeline-item里加icon属性,结果根本没生效,控制台也没报错,就是显示... 西门奥杰 组件 2026-02-26 17:19:19 2 回答 129 浏览 为什么Element Plus的加载动画在表格数据加载时没有显示? 在用Element Plus的el-table做数据加载时,按照文档写了v-loading="loading",但点击加载按钮后动画一直没出现,控制台也没报错,这是怎么回事? 我已经在data里定义了... 萌新.朝阳 组件 2026-02-14 13:54:28 2 回答 55 浏览 Element Plus分页点击页码后数据不更新怎么办? 用Element Plus的Pagination分页组件做列表页,页码点击后current-change事件能触发,但数据没变化,页面还是第一页内容。 已经按文档写了current-page绑定和@c... 皇甫怡平 组件 2026-01-30 20:27:29 1 回答 27 浏览 Element Plus分页组件怎么自定义每页显示条数? 我在用Element Plus的Pagination做表格分页,想让用户自己选每页显示多少条,比如10、20、50这样。但文档里没太看懂怎么配置,试了:page-sizes="[10, 20, 50]... Designer°自立 组件 2026-03-30 10:00:14
el-transfer 的 v-model 绑定的不是选中项的数组内容,而是绑定的“右侧面板的 key 值数组”。也就是说 selected 必须是一个 number 或 string 类型的数组,里面存的是 data 里每一项的 key 值。
你的 items 数据是不是长这样?
那 selected 初始得是空数组:
操作后如果右边有两项,selected 就变成
[1, 2],而不是把整个对象塞进去。重点来了:如果你的 items 里没有提供 key 字段,el-transfer 会拿 index 当 key,这就容易出问题,数据看着没变,其实是 key 对不上导致同步失败。
解决办法三个:
第一,确保每个 item 都有唯一 key 和 label
第二,v-model 绑定的 selected 是 key 的数组,别往里面 push 对象
第三,别手动改 selected,让组件自己更新,要用响应式
如果你非要监听变化,用 watch 监听 selected 就行,别去动 data 源头。
说白了就是一句话:v-model 控的是右边有哪些 key,不是哪些数据。搞清楚这个,基本就通了。
首先确保你的 items 数据长这样:
然后 selected 应该是一个存放 key 的数组,比如:
如果你初始化的时候 items 是从接口拿的,很可能 key 字段没加上,或者数据结构不对,导致组件没法正确追踪选中状态。
我的做法是:在获取到原始数据后,立刻用 map 处理一遍,补全 key 和 label
另外注意 v-model 绑定的 selected 一定要定义在 data 返回的对象里,不能漏掉。如果还是不更新,可以监听 change 事件看看有没有触发
在 handleChange 里打个 console.log,确认是不是真的没变化。大概率是你 items 缺少 key 导致组件无法正确响应。