1.动态路由渲染

1.1 首选梳理动态路由渲染流程,首先登录,然后获取动态路由菜单,然后把动态路由菜单处理一下,然后进行处理,存储到仓库中, 然后,在菜单组件中检测到仓库数据变化,生产动态路由,在路由守卫中检测是否页面刷新,当页面刷新的时候,再次请求接口,再次生成路由菜单。

/**
* @method 动态生成路由
*/
const Layout = () => import('@/layout/LayoutView.vue');
const modules = import.meta.glob('@/views/**/**.vue');
export const filterAsyncRoutes = (routes, roles) => {
if (!routes) return [];
const asyncRoutes: any = [];

routes.forEach((route) => {
const tmpRoute = { ...route }; // ES6扩展运算符复制新对象
if (!route.name) {
tmpRoute.name = route.path;
}
if (tmpRoute.component?.toString() == 'Layout') {
tmpRoute.component = Layout;
} else {
const component = modules[`/src/views/${tmpRoute.component}.vue`];
if (component) {
tmpRoute.component = component;
} else {
// tmpRoute.component = modules[`../../views/error-page/404.vue`];
}
}

if (tmpRoute.children) {
tmpRoute.children = filterAsyncRoutes(tmpRoute.children, roles);
}

asyncRoutes.push(tmpRoute);
});

return asyncRoutes;
};

2.动态路由支鼠标高亮篇章

2.1 首页先下载阿里图标库,下载 svg 图标,然后在 main.js 文件中引入该图标的 import ‘@/assets/font/index.css’;文件,然后在后台配置菜单,路由的地方生成菜单

<a-menu :style="{ width: '220px', height: '100%' }" v-model:open-keys="defaultMeau"
v-model:selected-keys="activeMenu" @collapse="onCollapse" show-collapse-button :collapsed-width="60"
:collapsed="collapsed" @menuItemClick="handlerItemSelect" v-if="menuList?.length">
<div v-for="item in menuList.filter((item) => item.meta.isMenu)" :key="item.path">
<a-sub-menu v-if="item.children && item.children.length > 0" :key="item.path">
<!-- 多个子菜单图标 -->
<template #icon>
<span class="menu__icon">
<svg class="icon" aria-hidden="true">
<use :xlink:href="`#icon-${item.meta.icon}`"></use>
</svg>
</span>
</template>
<!-- 多个子菜单一级目录 -->
<template #title>
<span>{{ item.meta.title }}</span>
</template>
<!-- 多个子菜单二级目录 -->
<a-menu-item :key="scoped.path" v-for="scoped in item.children.filter((item) => item.meta.isMenu)">
{{ scoped.meta.title }}
</a-menu-item>
</a-sub-menu>
<!-- 渲染没有子菜单的 -->
<!-- 渲染没有子菜单的 一级目录 -->
<template v-else>
<a-menu-item :key="item.path" class="one-menu">
<!-- 渲染没有子菜单的 一级图标 -->
<template #icon>
<span class="menu__icon">
<svg class="icon" aria-hidden="true">
<use :xlink:href="`#icon-${item.meta.icon}`"></use>
</svg>
</span>
</template>
<!-- 渲染没有子菜单的 一级菜单 -->
<template v-if="item.meta.isMenu == true">
<span>{{ item.meta.title }}</span>
</template>
</a-menu-item>
</template>
</div>
</a-menu>