Vue + sortable.js拖动排序后dom不渲染问题

注意:最终导致本文中问题的原因是循环中的key值,参考作者的另一篇文章:掘金

  

从一个 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 实现的,这样实际上是不会有问题的。

const tempItem = me.tabs.splice(e.oldIndex, 1)[0]
me.tabs.splice(e.newIndex, 0, tempItem)
复制代码

题外话 实际上,我们在 Vue 的数组书使用 splicepush等方法,Vue 都已经做了一层封装,所以它们才能出发视图更新,如果有想更加深入了解,可以阅读源码

Vue 强制刷新——$forceUpdate()

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

 

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

类似的代码如下:

// 在控制变量改变的时候进行 强制渲染更新

let childrenRefs = this.$refs.elTabs.$children
this.$nextTick(() => {
  childrenRefs.forEach(child => child.$forceUpdate())
})
复制代码

参考:www.imooc.com/wenda/detai…

最后的解决方法

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

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

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

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

// 代码参考:https://segmentfault.com/q/1010000009672767
mounted : function () {
  var that = this;
  var sortable1 = new Sortable(document.querySelector('#topicNumBox'), {
    sort: true,
    animation: 300,
    onEnd: function (evt) {  //拖拽结束发生该事件
      that.questionData.splice(evt.newIndex, 0, that.questionData.splice(evt.oldIndex, 1)[0]);
      var newArray = that.questionData.slice(0);
      that.questionData = [];
      that.$nextTick(function () {
        that.questionData = newArray;
      });
    },
  });
}
复制代码

结论

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

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

欢迎大家关注我的公众号~前端大杂货铺~

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: Vue3 Sortable.js 是一个基于 Vue3 和 Sortable.js 的可拖拽排序插件。Sortable.js 是一个轻量级的 JavaScript 库,用于在浏览器中创建可排序和可拖动列表。Vue3 Sortable.js 利用了 Vue3 的响应式系统,使得排序后的数据可以自动更新到组件中。 使用 Vue3 Sortable.js 可以轻松实现拖拽排序功能,只需要在组件中引入插件并设置相关参数即可。例如: ```vue <template> <div> <ul ref="list"> <li v-for="(item, index) in list" :key="item.id">{{ item.name }}</li> </ul> </div> </template> <script> import Sortable from 'vue3-sortablejs' export default { components: { Sortable }, data() { return { list: [ { id: 1, name: 'Item 1' }, { id: 2, name: 'Item 2' }, { id: 3, name: 'Item 3' } ] } }, mounted() { this.$nextTick(() => { this.sortable = Sortable.create(this.$refs.list, { onEnd: this.onSortEnd }) }) }, methods: { onSortEnd() { this.list = this.sortable.toArray().map((id, index) => { const item = this.list.find(item => item.id === Number(id)) return { ...item, order: index + 1 } }) } } } </script> ``` 这个例子中,我们通过在组件的 `mounted` 钩子中使用 `Sortable.create` 方法创建了一个可排序列表,并在 `onEnd` 回调中更新了数据。这样,每次拖拽排序结束后,我们都可以自动更新列表的顺序。 总之,Vue3 Sortable.js 是一个非常方便的可拖拽排序插件,可以帮助我们轻松实现拖拽排序功能。 ### 回答2: Vue3 sortable.js是一个用于创建可拖拽、可排序的列表的Vue组件。它基于Vue3和Sortable.js库开发,提供了一种简单的方式来实现对列表元素的排序和拖拽功能。 Vue3 sortable.js的使用方法非常简单。首先,我们需要在Vue项目中安装sortable.js库和vue3-sortable插件。然后,在需要使用可排序列表的组件中,引入vue3-sortable插件,并注册为全局可用的插件。 接下来,在需要实现拖拽排序功能的列表组件中,使用vue3-sortable插件提供的SortableList组件来包裹列表元素。在SortableList组件的属性中,我们可以指定列表项的唯一标识符、拖拽排序的方向(水平或垂直)、列表项之间的边距等。 在SortableList组件内部,我们可以使用Vue的v-for指令来循环渲染列表元素,并为每个元素绑定drag-handle类,使其可拖拽。在元素外部,我们还可以使用另一个SortableList组件来显示拖拽排序后的结果。 通过以上配置,我们就可以实现对列表元素的拖拽排序功能了。当我们拖拽列表元素时,sortable.js会自动更新列表中元素的顺序,并触发相关的拖拽排序事件。我们可以通过监听这些事件,来进行一些自定义的操作或处理。 总的来说,Vue3 sortable.js提供了一个简单、灵活的方式来实现可拖拽、可排序的列表,方便我们在Vue项目中实现交互式的排序功能。通过安装和配置相应的库和插件,我们可以轻松地为列表元素添加拖拽排序功能,并对相关事件进行监听和处理。 ### 回答3: vue3 sortable.js 是一个基于 Vue3 的插件,它提供了一种简单而强大的方式来实现拖拽排序功能。它借助了 HTML5 的拖放 API,使得我们可以直接在应用中拖动元素并重新排序vue3 sortable.js 的使用非常简单和直观。首先,我们需要在项目中安装并引入 sortable.js 的依赖。然后我们可以在需要使用拖拽排序功能的组件中注册 sortable.js,通过传入一些配置参数来定义我们希望实现的排序效果。 通过配置参数,我们可以定义排序的容器元素、排序的元素选择器、排序的方向等。对于拖放排序的元素,我们可以使用 v-for 指令来动态生成,并通过绑定特定的属性和事件来实现拖拽和排序的功能。 当我们在页面中拖动元素时,sortable.js 会自动捕捉拖动的元素,并实时更新元素的位置。当我们释放鼠标时,sortable.js 会触发回调函数,我们可以在回调函数中对排序结果进行处理,比如更新数据、发送请求等。 除了基本的拖拽排序功能,sortable.js 还提供了一些高级特性,比如可以限制拖动的区域、创建自定义的排序控制柄、实现嵌套排序等等。 综上所述,vue3 sortable.js 是一个非常实用的插件,它为我们提供了一种简单而灵活的方式来实现拖拽排序功能。无论是在管理后台的表格排序,还是在交互丰富的页面中,都可以利用它来提升用户体验并提高开发效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值