Vue.js结合SortableJS实现树形数据拖拽
作者:i东东 发布时间:2024-04-30 10:38:06
标签:Vue.js,树形,拖拽
需求
表格实现行拖拽,要求只支持同级拖拽!
实现
使用插件: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'
})
}
}
避坑(树形结构导致下标错乱)
如上代码,就可以在页面进行推拽了,但是因为是树形结构,所以拖拽结束的时候拿到的下标可能或错乱,这个时候就需要将数据打平,在进行拿值。
// 将树数据转化为平铺数据
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是通过虚拟DOM的比较来进行页面的更新,所以页面并不会因为获取了数据而更新,所以这时候就需要对key值进行操作了。
// 方法1
$forceUpdate
需要谨慎使用。 原因:它会强制整个组件的渲染,如果频度没有控制好,会一直渲染,导致应用性能变得很低!!(不过我用的不生效,不知道为啥)
// 方法2
this.key = Symbol(new Date().toString())
简单粗暴,直接给生成新的唯一值!!!太有效果了
至此,表格刷新完成,但是新的BUG随之而来....
避坑(刷新表格导致抖动)
如上图,这样的问题,暂时没想到什么好的办法,我直接加上了Loading
掩盖,解决之后如下,如此效果会稍微好一点,如果有更好的方法还望大家不吝赐教!
平级数据拖拽
平级数据拖拽不存在上面遇到的任何问题,正常写就好,展示一下:
小结
来源:https://juejin.cn/post/7229982932143226936
0
投稿
猜你喜欢
- 本文实例讲述了php基于curl主动推送最新内容给百度收录的方法。分享给大家供大家参考,具体如下:php curl的好处可以以最快的方式并且
- 1.进入官网https://www.python.org/,点击Downloads下的Windows按钮,进入下载页面。2.如下图所示,点击
- 锁的概念①、锁,在现实生活中是为我们想要隐藏于外界所使用的一种工具。②、在计算机中,是协调多个进程或线程并发访问某一资源的一种机制。③、在数
- <?php function BigEndian2Int($byte_word, $signed = false) { $int_va
- 程序没有改动过运行一直正常,突然有一天同事告知出现错误了。经过检查发现传递的数据中出现了#等特殊字符,浏览器只取到#号前面的数据,后面的被截
- python提供了大量的库,可以非常方便的进行各种操作,现在把python中实现读写csv文件的方法使用程序的方式呈现出来。在编写pytho
- 模块介绍:from ftplib import FTP ftp = FTP() #设置变量 ftp.set_debuglevel(2) #打
- 1、前言函数也是一个对象,从而可以增加属性,使用句点来表示属性。如果内部函数的定义包含了在外部函数中定义的对象的引用(外部对象可以是在外部函
- 本文实例讲述了php实现按照权重随机排序数据的方法。分享给大家供大家参考。具体实现方法如下:<?php /**
- 前言最近公司为客户重新部署了一套新环境,由我来完成了基础环境的配置,配置过程中总结了一些经验,分享给各位园友使用 curl 命令检查网络拿到
- 起步线上部署时因设置了 settings.DEBUG = False 会导致静态文件都是 404 的情况。主要原因是应为关闭DEBUG模式后
- 这篇文章主要介绍了微信小程序 云开发模糊查询实现详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友
- 一、概念介绍1、POST请求:HTTP/1.1 协议规定的 HTTP 请求方法有 OPTIONS、GET、HEAD、POST、PUT、DEL
- 本文实例为大家分享了微信小程序实现底部导航带跳转功能的具体代码,供大家参考,具体内容如下index.wxml<!--底部导航 --&g
- Golang 复制文件夹,包括文件夹中的文件/** * 拷贝文件夹,同时拷贝文件夹中的文件 * @param srcPath 需要拷贝的文件
- 1.实现点击按钮,复制文本框中的的内容<script type="text/javascript">func
- 本文实例讲述了python访问系统环境变量的方法。分享给大家供大家参考。具体如下:#----------------------------
- 对于单页应用,官方提供了vue-router进行路由跳转的处理,本篇主要也是基于其官方文档写作而成。安装基于传统,我更喜欢采用npm包的形式
- 这篇文章主要介绍了使用python脚本自动创建pip.ini配置文件代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的
- 前言Python处理Excel的包是openpyxl,其支持操作的文件类型为:.xlsx, .xlsm, .xltx, .xltmpip i