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>
|