我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

需求

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

实现

使用插件: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'
    })
  }
}

image.png

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

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

// 将树数据转化为平铺数据
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]
},

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

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

image.png

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

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

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

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

20230506171253_rec_.gif

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

20230506171541_rec_.gif

平级数据拖拽

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

20230506171828_rec_.gif

小结

到此这篇关于Vue.js结合SortableJS实现树形数据拖拽的文章就介绍到这了,更多相关Vue.js树形数据拖拽内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

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

本文主要介绍了Vue.js结合SortableJS实现树形数据拖拽,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-05-19

ADO.NET怎么通过拖拽形式实现数据库连接

本篇内容主要讲解“ADO.NET怎么通过拖拽形式实现数据库连接”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“ADO.NET怎么通过拖拽形式实现数据库连接”吧!ADO.NET程序设计实验步骤(1)
2023-06-17

java递归实现树形结构数据

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、树形结构是什么?二、实现方案1、stream流递归实现1.1 实体类1.2 实现类 2、jdk1.7以下实现2.1 节点类2.2 实现类
2023-08-18

JavaScript数组扁平转树形结构数据(Tree)的实现

本文主要介绍了JavaScript数组扁平转树形结构数据(Tree)的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2022-11-13

java递归实现树形结构数据完整案例

递归算法的代码比较简洁,可读性较好;但是在实际的业务处理中会出现多次的重复调用,如果处理不好,很容易出现StackOverflowError报错,这篇文章主要给大家介绍了关于java递归实现树形结构数据的相关资料,需要的朋友可以参考下
2023-05-17

编程热搜

目录