Files
soybean-admin/src/router/menus.ts
2021-09-15 07:35:38 +08:00

50 lines
1.4 KiB
TypeScript

import type { Component } from 'vue';
import { customRoutes } from './routes';
import { CustomRoute, GlobalMenuOption } from '@/interface';
import { dynamicIconRender } from '@/utils';
export function transformRouteToMenu(routes: CustomRoute[]) {
const globalMenu: GlobalMenuOption[] = [];
routes.forEach(route => {
if (asMenu(route)) {
const { name, path, meta } = route;
const routeName = name as string;
let menuChildren: GlobalMenuOption[] | undefined;
if (route.children) {
menuChildren = transformRouteToMenu(route.children as CustomRoute[]);
}
const menuItem: GlobalMenuOption = addPartialProps(
{
key: routeName,
label: meta?.title ?? routeName,
routeName,
routePath: path
},
meta?.icon,
menuChildren
);
globalMenu.push(menuItem);
}
});
return globalMenu;
}
/** 判断路由是否作为菜单 */
function asMenu(route: CustomRoute) {
return Boolean(route.meta?.asMenu);
}
/** 给菜单添加可选属性 */
function addPartialProps(menuItem: GlobalMenuOption, icon?: Component, children?: GlobalMenuOption[]) {
const item = { ...menuItem };
if (icon) {
Object.assign(item, { icon: dynamicIconRender(icon) });
}
if (children) {
Object.assign(item, { children });
}
return item;
}
export const menus = transformRouteToMenu(customRoutes);