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>
node-click
事件获取点击节点的数据node-key
和default-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 同级拖拽排序
<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>
draggable
属性开启可拖拽功能allow-drop
属性写方法判断节点能否被拖拽node-drop
属性获取拖拽成功节点的子级idfilter-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;
},