首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >sortable.js——Vue 数据更新问题

sortable.js——Vue 数据更新问题

作者头像
GopalFeng
发布于 2020-09-24 08:26:10
发布于 2020-09-24 08:26:10
4.1K00
代码可运行
举报
运行总次数:0
代码可运行

从一个 bug 说起

在一个需求中,我需要实现一个拖拽的功能,其中我使用了 sortable.js 去实现,但我发现我拖拽之后的数据并没有渲染在页面上。

简而言之,举个例子,原先的数组是 [1,2,3,4],拖拽之后,变成了 [4,1,2,3],但在视图上并没有显现,这不经让我疑惑不解,开始了以下问题的探索,在此记录一下

Vue 的数组更新问题

看到以上问题,你肯定会认为我处理数组的方式不对,毕竟官方文档明确指出了数组的几个坑

以下参考 Vue 文档 由于 JavaScript 的限制,Vue 不能检测以下数组的变动: 1.当你利用索引直接设置一个数组项时,例如:vm.items[indexOfItem] = newValue 2.当你修改数组的长度时,例如:vm.items.length = newLength

但是实际上,我避开了这个坑,实际的实现是通过 splice 实现的,这样实际上是不会有问题的。

代码语言:javascript
代码运行次数:0
运行
复制
  1. const tempItem = me.tabs.splice(e.oldIndex, 1)[0]
  2. me.tabs.splice(e.newIndex, 0, tempItem)

题外话 实际上,我们在 Vue 的数组书使用 splicepush等方法, Vue 都已经做了一层封装,所以它们才能出发视图更新,如果有想更加深入了解,可以阅读[源码]:https://ustbhuangyi.github.io/vue-analysis/reactive/questions.html#%E6%95%B0%E7%BB%84。

Vue 强制刷新——$forceUpdate()

对于这一点,尤大大表示,一般而言,我们都不需要用到的,如果需要用到的话,99.9%的情况,是自身的问题。

$forceUpdate() 的功能,就是迫使实例重新渲染,但尴尬的是,我使用了之后并没有效果,我觉得是我用错了,O__O "…

类似的代码如下:

代码语言:javascript
代码运行次数:0
运行
复制
  1. // 在控制变量改变的时候进行 强制渲染更新
  2. let childrenRefs = this.refs.elTabs.children
  3. this.$nextTick(() => {
  4. childrenRefs.forEach(child => child.$forceUpdate())
  5. })

参考:http://www.imooc.com/wenda/detail/439493

最后的解决方法

其实对于最后的解决方法,来源于 segmentfault,我还是心存疑问的,废话少说,我们来看代码

先用一个数据深拷贝数据,这里使用了 slice 方法,然后置空,最后在 $nextTick 中赋值深拷贝出来的数组值。最后可以了。

我猜测有两个,数组的长度不变,只是数组的长度变化, Vue检测不到,对于这个猜想,很容易就被自己推翻了,毕竟试了一下,并不会这样的。

那就可能是 sortable.js 的问题了

代码语言:javascript
代码运行次数:0
运行
复制
  1. // 代码参考:https://segmentfault.com/q/1010000009672767
  2. mounted : function () {
  3. var that = this;
  4. var sortable1 = new Sortable(document.querySelector('#topicNumBox'), {
  5. sort: true,
  6. animation: 300,
  7. onEnd: function (evt) { //拖拽结束发生该事件
  8. that.questionData.splice(evt.newIndex, 0, that.questionData.splice(evt.oldIndex, 1)[0]);
  9. var newArray = that.questionData.slice(0);
  10. that.questionData = [];
  11. that.$nextTick(function () {
  12. that.questionData = newArray;
  13. });
  14. },
  15. });
  16. }

结论

虽然问题解决了,但是最终的根源并没有找到O__O "…

但也提供一两种很强势的刷新数据的方法,以后需要用到的时候可以试下(愿你不会用到)

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-06-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 前端杂货铺 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
element关于table拖拽排序问题
博客地址:http://www.globm.top/blog/1/detail/41 最近在使用element table的时候,经常会遇到排序的问题,如果只是简单的排序的话,element官方已经给出了指定的方法
全栈程序员站长
2022/07/05
1.4K0
前端一面必会vue面试题1
为什么要有这些模式,目的:职责划分、分层(将Model层、View层进行分类)借鉴后端思想,对于前端而已,就是如何将数据同步到页面上
bb_xiaxia1998
2022/12/19
9900
使用 Sortable.js 库 实现 Vue3 elementPlus 的 el-table 拖拽排序
结合 Vue 3 和 Element Plus 框架,我们可以利用 Sortable.js 库轻松实现这一功能。本文将介绍如何在el-table组件中集成拖拽排序,使数据管理更加直观和高效。
空白诗
2024/11/02
2.5K0
使用 Sortable.js 库 实现 Vue3 elementPlus 的 el-table 拖拽排序
table表格拖拽
el-table 的拖拽使用 Sortable.js 官方文档 :https://github.com/SortableJS/Sortable
leader755
2022/03/09
3K1
深入浅出 Vue 中的 key 值
前几天我写了一篇文章,sortable.js——Vue 数据更新问题 ,当时自己只是从数据的强制刷新角度去分析,而且并没找到真正的“元凶”。
GopalFeng
2020/09/24
1.2K0
深入浅出 Vue 中的 key 值
我用Vue3做了个任务管理系统,踩了不少坑
最近闲着没事,想做个小项目练练手,就想着做一个任务管理系统。说起来简单,但真正动手才发现,里面的门道还真不少。今天就跟大家聊聊我在这个项目里遇到的那些事儿。
是山河呀
2025/07/24
1120
我用Vue3做了个任务管理系统,踩了不少坑
Vue.Draggable 文档总结
Vue.Draggable学习总结 Draggable为基于Sortable.js的vue组件,用以实现拖拽功能。
莫问今朝
2018/12/06
11.2K0
Vue 数组操作
变异方法(mutation method),顾名思义,会改变被这些方法调用的原始数组。相比之下,也有非变异(non-mutating method)方法,例如: filter(), concat() 和 slice() 。这些不会改变原始数组,但总是返回一个新数组。当使用非变异方法时,可以用新数组替换旧数组:
全栈程序员站长
2022/08/05
7820
vue源码分析-响应式系统(三)
在之前介绍数据代理章节,我们已经详细介绍过Vue数据代理的技术是利用了Object.defineProperty,Object.defineProperty让我们可以方便的利用存取描述符中的getter/setter来进行数据的监听,在get,set钩子中分别做不同的操作,达到数据拦截的目的。然而Object.defineProperty的get,set方法只能检测到对象属性的变化,对于数组的变化(例如插入删除数组元素等操作),Object.defineProperty却无法达到目的,这也是利用Object.defineProperty进行数据监控的缺陷,虽然es6中的proxy可以完美解决这一问题,但毕竟有兼容性问题,所以我们还需要研究Vue在Object.defineProperty的基础上如何对数组进行监听检测。
yyzzabc123
2022/10/17
4580
Vue你不得不知道的异步更新机制和nextTick原理
异步更新是 Vue 核心实现之一,在整体流程中充当着 watcher 更新的调度者这一角色。大部分 watcher 更新都会经过它的处理,在适当时机让更新有序的执行。而 nextTick 作为异步更新的核心,也是需要学习的重点。
WahFung
2020/08/22
1.4K0
vue基础(学习官方文档)
<!-- 即使 Alt 或 Shift 被一同按下时也会触发 --> <button @click.ctrl="onClick">A</button> <!-- 有且只有 Ctrl 被按下的时候才触发 --> <button @click.ctrl.exact="onCtrlClick">A</button> <!-- 没有任何系统修饰符被按下的时候才触发 --> <button @click.exact="onClick">A</button>
全栈程序员站长
2022/09/20
5.6K0
vue基础(学习官方文档)
字节前端二面高频vue面试题整理_2023-02-24
注意 :在子组件直接用 v-model 绑定父组件传过来的 prop 这样是不规范的写法 开发环境会报警告
yyds2026
2023/02/24
1.4K0
前端一面经典vue面试题(持续更新中)
只需要在组件即将被销毁的生命周期 componentWillUnmount (react)中在 LocalStorage / SessionStorage 中把当前组件的 state 通过 JSON.stringify() 储存下来就可以了。在这里面需要注意的是组件更新状态的时机。
bb_xiaxia1998
2022/12/07
1.1K0
仿手机底部导航栏制作
起初动手写这个仿手机底部导航栏,是因为某天刷手机 App 时,注意到很多应用虽然风格各异,但底部 Tab 栏却有着惊人的一致性:图标尺寸统一、动效自然、响应迅速,而且 UI 极为精致。那一瞬间我意识到,这小小一栏,其实是一个极具锻炼价值的练习场。不仅能挑战前端基础功(比如 Flex 布局和 SVG 运用),还涵盖了 CSS 动效、DOM 操作、甚至一些轻交互逻辑,比如徽章通知、拖拽排序和长按触发菜单等。如果能完整地模拟一套这样的交互体系,简直堪比做一个小型组件库。
繁依Fanyi
2025/05/11
2960
实现表格行的拖拽以及分页
在做一些后台管理系统时,表格的数据信息展示是很常见的需求,而对应的都是一些增删改查的操作
itclanCoder
2021/12/06
3.2K0
实现表格行的拖拽以及分页
vue课程大全
var app=new Vue({el:"#app",data:{msg:"hello vue!"}})
李才哥
2021/02/20
1.8K0
vue课程大全
Vue 【前端面试题】
看看面试题,只是为了查漏补缺,看看自己那些方面还不懂。切记不要以为背了面试题,就万事大吉了,最好是理解背后的原理,这样面试的时候才能侃侃而谈。不然,稍微有水平的面试官一看就能看出,是否有真才实学还是刚好背中了这道面试题
IT茂茂
2020/04/10
3.5K0
Vue 【前端面试题】
基于Vue实现跨表格(单选、多选表格项,单表格限制)相互拖拽
今天,我们将使用Vue.js来实现一个跨表格相互拖拽。在开发这个业务之前呢,也调研了网上很多解决方案,但个人感觉不太符合现在做的这个需求。所以,压根就自己再开发一套,方便以后维护。
Vam的金豆之路
2021/12/01
4K0
基于Vue实现跨表格(单选、多选表格项,单表格限制)相互拖拽
前端vue面试题集锦1
官方解释:Vue.extend 使用基础 Vue 构造器,创建一个“子类”。参数是一个包含组件选项的对象。
bb_xiaxia1998
2022/12/19
6470
Vue 全家桶,深入Vue 的世界
可以看到text值的变化是0 5 10 15 … 而并没有出现 0 1 2 3 … 这样连续的变化
FinGet
2019/06/28
2.8K0
Vue 全家桶,深入Vue 的世界
相关推荐
element关于table拖拽排序问题
更多 >
交个朋友
加入前端学习入门群
前端基础系统教学 经验分享避坑指南
加入腾讯云技术交流站
前端技术前沿探索 云开发实战案例分享
加入云开发企业交流群
企业云开发实战交流 探讨技术架构优化
换一批
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档