vue实现el-tree操作后默认展开该节点和同级节点拖拽并进行前后端排序

问题一:实现el-tree 删除、添加、编辑后默认展开该节点

操作视频如下

el-tree节点操作后仍展开

节点代码

javascript 复制代码
<template>
   <el-tree
	   v-loading="loading"
	   ref="tree"
	   element-loading-text="加载中"
	   highlight-current
	   :data="treeData"
	   :props="defaultProps"
	   node-key="id"
	   :default-expanded-keys="defaultKey"
	   @node-click="handleNodeClick"
   />
</template>

实现步骤:

  1. 通过el-tree的node-click事件获取点击节点的数据
  2. 通过递归获取点击节点的所有父级的id
  3. 通过node-keydefault-expanded-keys属性绑定获取的父级id和自身id

逻辑代码如下

javascript 复制代码
	data() {
		return {
		  treeData:[], // el-tree数据
		  defaultKey:[], // 默认展开的数据
		  defaultProps: {
				children: 'child',
				label: 'name',
		  },
		}
	},
    methods: {
		/**
		 * @func 获取当前点击节点数据,根据当前数据查询该数据的所有父级id
		 * @params {Object} data
		 * @return void
		 */
		async handleNodeClick(data) {
			// 使用递归------编辑、删除、添加完成之后该节点仍是展开状态
			let dataArr = this.findParentIds(this.treeData, data.id);
			this.defaultKey = dataArr;
		},
		/**
		 * 根据树子节点ID查找所有父节点ID
		 * @param {array} dataSource 树形结构数据源
		 * @param {number} nodeId 子节点ID
		 * @returns {array} 包含所有父节点ID的数组,按照从根节点到直接父节点的顺序排序
		 */
		findParentIds(dataSource, nodeId) {
			const parentIds = []; // 用于存储所有父节点ID的数组
			// 定义一个递归函数,用于遍历整棵树并查找子节点的所有父节点
			function traverse(node, nodeId) {
				if (node.id === nodeId) {
					// 如果当前节点的ID等于子节点的ID,则表示已经找到了子节点,可以开始向上查找父节点
					return true; // 返回true表示已经找到了子节点
				}
				if (node.child) {
					// 如果当前节点有子节点,则继续遍历子节点
					for (const childNode of node.child) {
						if (traverse(childNode, nodeId)) {
							// 如果在子节点中找到了子节点的父节点,则将当前节点的ID添加到父节点ID数组中,并返回true表示已经找到了子节点
							parentIds.push(node.id);
							return true;
						}
					}
				}
				return false; // 如果当前节点不是子节点的父节点,则返回false
			}
			// 从根节点开始遍历整棵树,并调用递归函数查找子节点的所有父节点
			for (const node of dataSource) {
				if (traverse(node, nodeId)) {
					// 如果在当前节点的子树中找到了子节点的父节点,则直接退出循环
					break;
				}
			}
			return parentIds.length ? [...parentIds, nodeId] : [nodeId]; // 返回所有父节点ID和自身id
		},
    }

问题二:el-tree 同级节点拖拽并进行前后端排序+筛选

操作视频如下

el-tree 同级拖拽排序

节点代码

javascript 复制代码
<template>
   <el-tree
	   v-loading="loading"
	   ref="tree"
	   element-loading-text="加载中"
	   highlight-current
	   :data="treeData"
	   :props="defaultProps"
	   :draggable="true"
	   :allow-drop="allowDrop"
	   :filter-node-method="filterNode"
	   	@node-drop="handleDrop"
   />
</template>

实现步骤:

  1. 通过el-tree的draggable属性开启可拖拽功能
  2. 通过el-tree的allow-drop属性写方法判断节点能否被拖拽
  3. 通过el-tree的node-drop属性获取拖拽成功节点的子级id
  4. 将获取拖拽节点的子集id传给后端
  5. 外加筛选是用到了filter-node-method属性

逻辑代码如下

javascript 复制代码
		/**
		 * @func  判断拖拽的数据是否是同一层级
		 */
		allowDrop(draggingNode, dropNode, type) {
			if (draggingNode.level === dropNode.level) {
				if (draggingNode.data.pid === dropNode.data.pid) {
					return type === 'prev' || type === 'next';
				}
			} else {
				return false;
			}
		},
		/**
		 * @func  拖拽成功事件
		 */
		handleDrop(draggingNode, dropNode) {
			let list = [];
			// 获取子级id
			for (let item of dropNode.parent.childNodes) {
				list.push(item.data.id);
			}
			// 将该节点排序后的子级id传给后端
			this.funGetDragSort(list);
		},
		/**
		 * @func  调后端接口------子级id传给后端
		 */
		async funGetDragSort(val) {
			await datamanagement.updateCategorySort(val);
		},
		/**
		 * @func  左侧el-tree控件搜索
		 * @return void
		 */
		filterNode(value, data) {
			if (!value) return true;
			return data.name.indexOf(value) !== -1;
		},
相关推荐
刘一说2 分钟前
深入理解 Spring Boot Web 开发中的全局异常统一处理机制
前端·spring boot·后端
啃火龙果的兔子13 分钟前
前端导出大量数据到PDF方案
前端·pdf
Lj2_jOker21 分钟前
QT 给Qimage数据赋值,显示异常,像素对齐的坑
开发语言·前端·qt
csj5041 分钟前
前端基础之《React(7)—webpack简介-ESLint集成》
前端·react
咚咚咚小柒1 小时前
【前端】Webpack相关(长期更新)
前端·javascript·webpack·前端框架·node.js·vue·scss
2501_916008891 小时前
前端工具全景实战指南,从开发到调试的效率闭环
android·前端·小程序·https·uni-app·iphone·webview
诸葛韩信1 小时前
Webpack与Vite的常用配置及主要差异分析
前端·webpack·node.js
IT_陈寒1 小时前
Vite 5震撼发布!10个新特性让你的开发效率飙升200% 🚀
前端·人工智能·后端
一路向前的月光1 小时前
uniapp(5)滚动列表scroll-view
前端·javascript·uni-app
Hilaku1 小时前
就因为package.json里少了个^号,我们公司赔了客户十万块
前端·javascript·npm