Files
orion-visor/orion-ops-ui/src/components/menu/tree/use-menu-tree.ts

67 lines
1.7 KiB
TypeScript
Raw Normal View History

2023-07-24 10:05:07 +08:00
import { computed } from 'vue';
import { RouteRecordRaw, RouteRecordNormalized } from 'vue-router';
2023-09-25 22:05:48 +08:00
import { useMenuStore } from '@/store';
2023-07-24 10:05:07 +08:00
import { cloneDeep } from 'lodash';
export default function useMenuTree() {
2023-09-25 22:05:48 +08:00
const menuStore = useMenuStore();
2023-07-24 10:05:07 +08:00
const appRoute = computed(() => {
2023-09-25 22:05:48 +08:00
return menuStore.appMenus;
2023-07-24 10:05:07 +08:00
});
const menuTree = computed(() => {
const copyRouter = cloneDeep(appRoute.value) as RouteRecordNormalized[];
copyRouter.sort((a: RouteRecordNormalized, b: RouteRecordNormalized) => {
return (a.meta.order || 0) - (b.meta.order || 0);
});
2023-07-27 18:48:15 +08:00
2023-07-24 10:05:07 +08:00
function travel(_routes: RouteRecordRaw[], layer: number) {
if (!_routes) return null;
const collector: any = _routes.map((element) => {
2023-07-29 13:11:19 +08:00
// 隐藏子目录
2023-07-24 10:05:07 +08:00
if (element.meta?.hideChildrenInMenu || !element.children) {
element.children = [];
2023-07-29 13:11:19 +08:00
if (element.meta?.hideInMenu) {
// 如果隐藏菜单 则不显示
return null;
} else {
return element;
}
2023-07-24 10:05:07 +08:00
}
2023-07-29 13:11:19 +08:00
// 过滤不显示的菜单
2023-07-24 10:05:07 +08:00
element.children = element.children.filter(
(x) => x.meta?.hideInMenu !== true
);
2023-07-29 13:11:19 +08:00
// 关联子节点
2023-07-24 10:05:07 +08:00
const subItem = travel(element.children, layer + 1);
if (subItem.length) {
element.children = subItem;
return element;
}
2023-07-29 13:11:19 +08:00
// 第二层 (子目录)
2023-07-24 10:05:07 +08:00
if (layer > 1) {
element.children = subItem;
return element;
}
2023-07-29 13:11:19 +08:00
// 是否隐藏目录
2023-07-24 10:05:07 +08:00
if (element.meta?.hideInMenu === false) {
return element;
}
return null;
});
return collector.filter(Boolean);
}
2023-07-27 18:48:15 +08:00
2023-07-24 10:05:07 +08:00
return travel(copyRouter, 0);
});
return {
menuTree,
};
}