fix: tree.ts 报错,在 dept-tree.vue 无法加载的问题

pull/71/head
YunaiV 2025-04-07 22:47:30 +08:00
parent 17f947016d
commit 5b60c93e4e
2 changed files with 44 additions and 35 deletions

View File

@ -1,61 +1,70 @@
// TODO @芋艿1代码优化2是不是抽到公共的
// todo @芋艿:公用逻辑
interface TreeNode {
[key: string]: any;
children?: TreeNode[];
}
/**
*
*
* @param {*} data
* @param {*} id id 'id'
* @param {*} parentId 'parentId'
* @param {*} children 'children'
*/
export const handleTree = (
data: any[],
id?: string,
parentId?: string,
children?: string,
) => {
data: TreeNode[],
id: string = 'id',
parentId: string = 'parentId',
children: string = 'children'
): TreeNode[] => {
if (!Array.isArray(data)) {
console.warn('data must be an array');
return [];
}
const config = {
id: id || 'id',
parentId: parentId || 'parentId',
childrenList: children || 'children',
id,
parentId,
childrenList: children
};
const childrenListMap: Record<string | number, TreeNode[]> = {};
const nodeIds: Record<string | number, TreeNode> = {};
const tree: TreeNode[] = [];
const childrenListMap: any = {};
const nodeIds: any = {};
const tree: any[] = [];
// 1. 数据预处理
// 1.1 第一次遍历,生成 childrenListMap 和 nodeIds 映射
for (const d of data) {
const parentId = d[config.parentId];
if (childrenListMap[parentId] === null) {
childrenListMap[parentId] = [];
const pId = d[config.parentId];
if (childrenListMap[pId] === undefined) {
childrenListMap[pId] = [];
}
nodeIds[d[config.id]] = d;
childrenListMap[parentId].push(d);
childrenListMap[pId].push(d);
}
// 1.2 第二次遍历,找出根节点
for (const d of data) {
const parentId = d[config.parentId];
if (nodeIds[parentId] === null) {
const pId = d[config.parentId];
if (nodeIds[pId] === undefined) {
tree.push(d);
}
}
for (const t of tree) {
adaptToChildrenList(t);
}
function adaptToChildrenList(o: any) {
if (childrenListMap[o[config.id]] !== null) {
o[config.childrenList] = childrenListMap[o[config.id]];
}
if (o[config.childrenList]) {
for (const c of o[config.childrenList]) {
adaptToChildrenList(c);
// 2. 构建树结:递归构建子节点
const adaptToChildrenList = (node: TreeNode): void => {
const nodeId = node[config.id];
if (childrenListMap[nodeId]) {
node[config.childrenList] = childrenListMap[nodeId];
// 递归处理子节点
for (const child of node[config.childrenList]) {
adaptToChildrenList(child);
}
}
};
// 3. 从根节点开始构建完整树
for (const rootNode of tree) {
adaptToChildrenList(rootNode);
}
return tree;
};
}

View File

@ -1,11 +1,11 @@
<script lang="ts" setup>
import type { SystemDeptApi } from '#/api/system/dept';
import { type SystemDeptApi} from '#/api/system/dept';
import { Tree, Input, Spin } from 'ant-design-vue';
import { ref, onMounted } from 'vue';
import { Search } from '@vben/icons';
import { getDeptList } from '#/api/system/dept';
import { getSimpleDeptList } from '#/api/system/dept';
import { handleTree } from '#/utils/tree';
const emit = defineEmits(['select']);
@ -36,7 +36,7 @@ const handleSelect = (_selectedKeys: any[], info: any) => {
onMounted(async () => {
try {
loading.value = true;
const data = await getDeptList();
const data = await getSimpleDeptList();
deptList.value = data;
deptTree.value = handleTree(data);
} catch (error) {