之前做项目有遇到过使用el-tree的,但是树形结构拖拽还是第一次遇到,开始觉得会好难(心里暗示),因为考虑到好多种情况,做完之后其实还好,在此记录一下~

首先,树形结构的拖拽---

 <el-treev-model="filterText"//过滤class="tree":data="projectNameOptions"node-key="id":props="chapterProps"           default-expand-all//默认展开所有节点    :filter-node-method="filterNode"ref="projectNameOptions"            draggable//是否开启拖拽节点功能,默认为false@node-drop="handleDrop"//拖拽完成时触发的事件//共四个参数,依次为:被拖拽节点对应的 Node、结束拖拽时最后进入的节点、被拖拽节点的放置位置(before、after、inner)、event>

其实,只需要一个属性即可:

前端拖拽一个属性就搞定了,so easy,接下来就是让人头疼的地方了,前端拖拽之后我们需要持久化到数据库呀,不然拖拽只是前端的一个动画效果而已。为什么说是让人头疼的地方呢,因为当时考虑了好多好多种情况,整个人脑子都要炸了,感激这位网友的这篇博客真的是救了我一命=​​​​​​ElementUI El-Tree 任意拖拽排序方法,最小粒度数据变更范围(通用排序)_小狐狸和小兔子-CSDN博客_eltree拖拽排序实现思路

详情如下:

// 拖拽完成时触发的事件  参数依次为:被拖拽节点、结束拖拽时最后进入的节点、被拖拽节点的放置位置(before、after、inner)、event//注意:目标节点是已经移动完之后的节点handleDrop: async function(draggingNode, dropNode, dropType, ev) {//定义一个空数组用于存放需要持久化到数据库的节点var paramData = [];//当拖拽类型不为inner,说明只是在现有的节点间移动,只需要寻找目标节点的父ID,获取其对象以及所有的子节点,data为目标节点的父节点;//否则,当拖拽类型为inner,说明拖拽节点成为了目标节点的子节点,只需要获取目标节点对象即可,data为目标节点var data = dropType != "inner" ? dropNode.parent.data : dropNode.data;//目标节点的level==1即目标节点为一级节点,//并且拖拽类型不为inner即当前节点将成为与目标节点同一层级的节点,也是一级节点//nodeDate=data,通过上面的公式data=dropNode.parent.data,因此,nodeData=dropNode.parent.data,但是因为目标节点已经是一级节点了,因此,nodeData还是目标节点//否则//目标节点的level==1即目标节点为一级节点,//并且拖拽类型为inner即当前节点将成为目标节点的子节点即二级节点//nodeDate=data.childrens,通过上面的公式data=dropNode.parent.data,因此,nodeData=dropNode.parent.data.childrens,即为目标节点的父节点的子节点,即目标节点同一层级的节点//或者//目标节点的level!=1即目标节点不是一级节点,//并且拖拽类型不为inner即当前节点将成为与目标节点同一层级的节点 //nodeDate=data.childrens,通过上面的公式data=dropNode.parent.data,因此,nodeData=dropNode.parent.data.childrens,即为目标节点的父节点的子节点,即目标节点同一层级的节点//或者//目标节点的level!=1即目标节点不是一级节点//并且拖拽类型为inner即当前节点将成为目标节的子节点,通过上面的公式//nodeDate=data.childrens,通过上面的公式data=dropNode.data,因此,nodeData=dropNode.data.childrens,即目标节点的子节点//定义要循环的节点var nodeData = dropNode.level == 1 && dropType != "inner" ? data : data.childrens;nodeData.forEach(element=>{//设置父ID,当目标节点level为1说明在第一层,父ID为空;//否则,父id为data.id//当拖拽类型不为inner时,element.parentId=data.id=dropNode.parent.data.id即目标节点的父节点的id//当拖拽类型为inner时,element.parentId=data.id=dropNode.data.id即目标节点的idelement.parentId = dropNode.level == 1 ? "" : data.id;});var pri=1nodeData.forEach((element, i) => {//当拖拽类型不为inner,为before或after时,说明只是在目前已有的层级间移动//只需要寻找目标节点的parentId,即为当前节点的parentId//         与目标节点的同一层级的节点的priority按照现在的排列顺序重新排列1++var dept = {id: element.id,parentId: element.parentId,priority:pri++,projectName:element.projectName};paramData.push(dept);});updateProject(paramData).then((res) => {console.log(res);if (res.code == '200') {this.$message({message: '更新成功',type: 'success'});paramData={}}else{this.$message({message: '更新失败',type: 'error'});}})},

看到上面的注释太多可能容易让人不想看,觉得太复杂,小编整理了一个思维导图的形式:

总结:不要给自己设限,不要在没有做一件事之前做假设,干就完了!!!

【el-tree】树形结构拖拽相关推荐

  1. Vue + Element 表格拖拽排序、树形表格拖拽排序

    今天给大家分享一下表格(列表)及树形表格拖拽排序,树形表格排序的教程不多,可能还会有问题,我在这里详细给大家讲解一下,如果你有这样的需求或觉得有用,请给个关注或收藏一下吧,方便后期查看使用. 安装so ...

  2. 使用ztree.js,受益一生,十分钟学会使用tree树形结构插件

    看到ztree.js,这几个字眼,毋庸置疑,那肯定就是tree树形结构了,曾经的swing年代有jtree,后来jquery年代有jstree和treeview,虽然我没写过,但是我见过,一些小功能做 ...

  3. 树形可拖拽排序配置组件

    效果 使用场景 vue2下自定义表格表头配置: 列排序,显示/隐藏等.确保表头以配置项的形式加载,这样表格才能对修改后的配置作响应 思路 1.表格使用render函数加载(如有疑问可私信),通过类似如 ...

  4. java 树结构_Java通用tree树形结构

    前言 现在大部分都是后端封装树形结构,第一次做的时候想从网上找通用,发现大部分都是要用类的get/set方法,不一样就要改,毕竟懒,改就改改,后来发现部门要,地区要,分类要,于是想着就把之前的用注解和 ...

  5. easyu tree节点的拖拽(1)

    <div id="treediv"> <ul id='tt'></ul> </div> <script> var tre ...

  6. 把数据转换为在内存中Tree(树形结构)。_备战秋招:一文搞定数据库常见面试题...

    点击上方"蓝字",关注了解更多 1.数据库范式 第一范式:列不可分,eg:[联系人](姓名,性别,电话),一个联系人有家庭电话和公司电话,那么这种表结构设计就没有达到 1NF: 第 ...

  7. 关于element tree树形结构设置默认展开第一级,第二级,第三级,以此类推

    官方default-expand-all是否默认展开所有节点,这个在这里已经不够用了. 第一步:设置node-key属性,每个树节点用来作为唯一标识的属性,整棵树应该是唯一的.例如:node-key= ...

  8. XML Tree(树形结构)

    xml文档(xml document)使用树形结构表达,以根结点root为开始,逐渐向下发散.它使用一种可自我描述的简单的语法. 一个xml文档分为文件序言(declaration)和文件主体两个大的 ...

  9. EasyUI之Tree树形结构(一)

    官网地址:www.jeasyui.net/plugins/186- 前端代码: $("#menuTreegrid").treegrid({url: SysResource.URL. ...

最新文章

  1. 他开发了 redux,昨晚“字节一面”却挂了?
  2. Java网络编程笔记2
  3. 久违了我的博客园《人生的体会》
  4. linux命令:mkdir 命令详解
  5. Javascript学习总结 - JS基础系列 二
  6. php 模数 指数 公钥生成_php实现JWT认证
  7. MySQL在其版本迭代后Online DDL功能发生了哪些变化?
  8. c语言求一个数因数个数,【代码】求一个数的因数和、求优化、顺便也供新人参考算法...
  9. 深入理解计算机系统(1.3)------操作系统的抽象概念
  10. python代码加密
  11. kmeans聚类算法_常用聚类算法综述
  12. 零点和极点到底影响了什么?什么是最小相位系统?
  13. 示波器电流探头可分为无源和有源两类,它们的区别是什么?
  14. 一维数组与二维数组的区别
  15. 使用D3渲染中国地图
  16. 编写一个JSP页面,实现根据一个人的18位身份证显示出生日的功能,要求把表达式声明和Scriptlet全部用到,并把结果显示在表格中
  17. 信号完整性和电源完整性基本介绍
  18. 第七周--项目1-静态成员应用
  19. 4. 多重建模-不同视角
  20. 表情符号(emoji)大全,只此一文便够了

热门文章

  1. Python爬虫实战,pyecharts模块,Python实现奥斯卡金像奖数据可视化
  2. 只看活动结案报告?营销活动效果你还能做的更好
  3. 潮汕牛肉火锅,美味在你身边
  4. Java的synchronized的使用_Java synchronized的使用
  5. 被百度接纳了一年的熊孩子!
  6. HIWIN、IKO滑块HGH15CA、LWHD15B型号替换
  7. 移动端的认识与android环境搭建和adb 基础命令
  8. JVM系列五JVM监测工具[整理中(转)
  9. 安装w3af时已经安装retire却提示没有安装的问题
  10. 中国石油大学(北京)-《石油加工工程》第三阶段在线作业