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

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

操作视频如下

el-tree节点操作后仍展开

节点代码

<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

逻辑代码如下

	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 同级拖拽排序

节点代码

<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属性

逻辑代码如下

		/**
		 * @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;
		},
  • 13
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue el-tree组件是一个支持层级树结构的组件,可以用于展示组织结构、文件目录等树型结构。给每个节点后面添加输入框的需求可能是为了让用户编辑节点的名称或其他信息。实现这个需求的步骤如下: 1. 在el-tree中的node默认插槽中添加一个输入框,如下: ``` <el-tree :data="data"> <template slot="node" slot-scope="{ node, data }"> <span>{{ node.label }}</span> <el-input v-model="node.name"></el-input> </template> </el-tree> ``` 2. 在data中添加需要修改的节点的name属性,然后在用户编辑输入框中的内容时实时更新该节点的name属性,如下: ``` data() { return { data: [ { label: '第一层', children: [ { label: '第二层', children: [ { label: '第三层', name: '节点名称' } ] } ] } ] } } ``` ``` <el-tree :data="data"> <template slot="node" slot-scope="{ node, data }"> <span>{{ node.label }}</span> <el-input v-model="node.name"></el-input> </template> </el-tree> ``` 3. 在用axios发送保存请求时,将修改的节点数据传给后端,让后端修改相应节点的数据,如下: ``` methods: { saveNodeData(node) { axios.post('/api/saveNodeData', { node }).then(res => { console.log(res.data) }).catch(error => { console.log(error.response.data) }) } } ``` 通过以上几个步骤,即可实现el-tree中给每个节点后面添加输入框并保存数据的功能。注意,这只是实现的一个思路,具体实现还需要结合项目实际情况进行调整和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值