Vue.js结合SortableJS实现树形数据拖拽

作者:i东东 时间:2024-04-30 10:38:06 

需求

表格实现行拖拽,要求只支持同级拖拽!

实现

使用插件:SortableJS,可以参考官网配置项!

// 安装
npm install sortablejs --save
// 引入
import Sortable from 'sortablejs';
//my-table组件中
// 排序功能
setDragSort() {
//获取需要添加拖拽的组件
 const el =
     this.$refs.elTable &&
     this.$refs.elTable.$el.querySelector(
       '.el-table__body-wrapper > table > tbody'
     )
// 判断是props传递的参数(是否开启拖拽,拖拽结束的方法,拖拽的组件)是否存在
 if (this.draggable && this.onDragEnd && el) {
   if (this.dragSort) this.dragSort.destroy() // 防止在Dom上重复绑定事件
   this.dragSort = sortablejs.create(el, {
     onEnd: (evt) => this.onDragEnd(evt),
     handle: this.handle ? `.${this.handle}` : '', // 可以拖拽的手柄,传入的为类名
     filter: '.el-input, .el-textarea', // 过滤器,不需要进行拖动的元素
     preventOnFilter: false, // 在触发过滤器`filter`的时候调用`event.preventDefault()`
     ghostClass: 'sortable-ghost'
   })
 }
}

Vue.js结合SortableJS实现树形数据拖拽

避坑(树形结构导致下标错乱)

如上代码,就可以在页面进行推拽了,但是因为是树形结构,所以拖拽结束的时候拿到的下标可能或错乱,这个时候就需要将数据打平,在进行拿值。

// 将树数据转化为平铺数据
treeToTile(treeData, childKey = 'children') {
 const arr = []
 const expanded = data => {
   if (data && data.length > 0) {
     data.filter(d => d).forEach(e => {
       arr.push(e)
       expanded(e[childKey] || [])
     })
   }
 }
// 拖拽结束
async handleNodeDrag(evt) {
 const { newIndex, oldIndex } = evt
 // 把树形的结构转为列表再进行处理
 const activeRows = this.treeToTile(this.table.data)
 const oldData = activeRows[oldIndex]
 const newData = activeRows[newIndex]
},

通过平铺之后就可以正常拿到拖拽前后的正确的下标了,这样就可以进行下一步的操作了(提交更改到后端-->重新获取数据-->渲染页面)

避坑(树形结构导致拖拽父级子级数据不跟随父级移动)

Vue.js结合SortableJS实现树形数据拖拽

如上图,拖拽之后子级数据并没有跟随父级,这样就导致页面显示不正确,解决方法:首先想到的当然既然已经拖拽成功,那么肯定直接像后端获取数据来进行表格的刷新,但是试了一下表格并没有更新,因为我只是改变了顺序,其他所有内容都没有变,就导致Vue是通过虚拟DOM的比较来进行页面的更新,所以页面并不会因为获取了数据而更新,所以这时候就需要对key值进行操作了。

// 方法1
$forceUpdate
需要谨慎使用。 原因:它会强制整个组件的渲染,如果频度没有控制好,会一直渲染,导致应用性能变得很低!!(不过我用的不生效,不知道为啥)
// 方法2
this.key = Symbol(new Date().toString())
简单粗暴,直接给生成新的唯一值!!!太有效果了

至此,表格刷新完成,但是新的BUG随之而来....

避坑(刷新表格导致抖动)

Vue.js结合SortableJS实现树形数据拖拽

如上图,这样的问题,暂时没想到什么好的办法,我直接加上了Loading掩盖,解决之后如下,如此效果会稍微好一点,如果有更好的方法还望大家不吝赐教!

Vue.js结合SortableJS实现树形数据拖拽

平级数据拖拽

平级数据拖拽不存在上面遇到的任何问题,正常写就好,展示一下:

Vue.js结合SortableJS实现树形数据拖拽

小结

来源:https://juejin.cn/post/7229982932143226936

标签:Vue.js,树形,拖拽
0
投稿

猜你喜欢

  • 基于python实现简单网页服务器代码实例

    2023-06-26 07:56:44
  • 基于Python绘制520表白代码

    2021-06-10 08:14:44
  • JavaScript简单获取页面图片原始尺寸的方法

    2024-02-23 14:23:33
  • python中is与双等于号“==”的区别示例详解

    2023-07-09 22:40:19
  • oracle dba 应该熟悉的命令

    2009-07-02 12:08:00
  • 在Python函数中输入任意数量参数的实例

    2022-07-09 04:58:08
  • python连接FTP服务器的实现方法

    2022-04-07 14:34:03
  • java代码获取数据库表里数据的总数操作

    2024-01-14 23:41:31
  • 深入浅析Django MTV模式

    2021-08-18 07:55:32
  • MYSQL 数据库同步

    2008-11-24 12:39:00
  • 关于Matplotlib绘制动态实时曲线的方法改进指南

    2021-03-17 23:48:10
  • JS中数组重排序方法

    2024-04-22 22:34:27
  • Python中GIL全局解释锁的实现

    2023-04-27 16:29:14
  • Django连接MQTT的示例代码

    2022-10-04 22:40:39
  • CSS3的五个使用技巧[译]

    2009-02-19 13:01:00
  • XML:OpenSearch 浏览器指定搜索应用

    2010-05-04 19:37:00
  • python+selenium实现登录账户后自动点击的示例

    2021-07-26 05:40:21
  • python模拟键盘输入 切换键盘布局过程解析

    2021-11-19 17:19:43
  • MySQL数据同步Elasticsearch的4种方案

    2024-01-28 18:10:49
  • mysql千万级数据量根据索引优化查询速度的实现

    2024-01-21 19:16:31
  • asp之家 网络编程 m.aspxhome.com