vue动态添加路由,element-admin后台路由

很多后台项目的菜单都是可配置的
所以需要从后台取到菜单数据并加到路由映射用

1.第一步,将后台数据转换成vue-router 需要的数据格式,以下是路由格式

declare type RouteConfig = {
  path: string; //路径
  component?: Component;//对应模块
  name?: string; // 命名路由
  components?: { [name: string]: Component }; // 命名视图组件
  redirect?: string | Location | Function;
  props?: boolean | Object | Function;
  alias?: string | Array<string>;
  children?: Array<RouteConfig>; // 嵌套路由
  beforeEnter?: (to: Route, from: Route, next: Function) => void;
  meta?: any;

  // 2.6.0+
  caseSensitive?: boolean; // 匹配规则是否大小写敏感?(默认值:false)
  pathToRegexpOptions?: Object; // 编译正则的选项
}

这里特别要注意的是component的写法
component = () => import(@/views${nm.path})

webpack 编译es6 动态引入 import() 时不能传入变量,例如import(dir) , 而要传入字符串 import(‘path/to/my/file.js’),这是因为webpack的现在的实现方式不能实现完全动态。

但一定要用变量的时候,可以通过字符串模板来提供部分信息给webpack;例如import(./path/${myFile}), 这样编译时会编译所有./path下的模块,但运行时确定myFile的值才会加载,从而实现懒加载。

最后再用
router.addRoutes(accessRoutes)
将转换好的数组添加到路由映射中

这里有一点需要注意,就是addRoutes应放在路由守卫

router.beforeEach(async(to, from, next) => {
       router.addRoutes(accessRoutes)
})
### Vue-element-admin 后台动态路由实现与配置 #### 动态路由的核心逻辑 Vue-element-admin一个基于 VueElement UI 构建的后台管理框架,其核心功能之一就是支持动态路由。通过动态加载路由表并将其映射到菜单结构中,可以灵活地满足不同用户角色的需求。 以下是关于如何在 vue-element-admin 中实现后台动态路由的关键点: --- #### 路由模块解析 (`src/router/index.js`) `src/router/index.js` 文件定义了项目的静态路由和异步加载机制。它分为两部分:常量路由(constant routes)和动态路由(async routes)。 - 常量路由通常是不需要权限验证的基础页面,比如登录页、错误页等[^1]。 - 动态路由则根据用户的权限从后端获取,并通过 `addRoutes` 方法注入到 Vue Router 实例中[^4]。 代码示例如下: ```javascript // src/router/index.js import { createRouter, createWebHistory } from 'vue-router' const constantRoutes = [ { path: '/login', component: () => import('@/views/login/index.vue') } ] export function resetRouter() {} export default createRouter({ history: createWebHistory(), routes: constantRoutes }) ``` --- #### 权限控制模块 (`src/permission.js`) `src/permission.js` 主要负责拦截未授权访问的行为以及动态挂载路由。当用户成功登录后,会触发一次请求来拉取该用户的路由数据,并将其注册到路由器中[^2]。 具体流程如下: 1. 用户完成身份认证后,向服务器发送请求以获取对应的路由列表; 2. 将返回的结果存入 Vuex Store 并调用 `router.addRoute()` 添加新路径; 3. 如果检测到当前访问地址不在已知范围内,则重定向至首页或其他默认位置。 相关代码片段展示: ```javascript // src/permission.js import router from './router' import store from '@/store' function hasPermission(roles, route) { if (route.meta && route.meta.roles) { return roles.some(role => route.meta.roles.includes(role)) } else { return true } } router.beforeEach((to, from, next) => { const roles = store.getters.roles if (!roles.length) { store.dispatch('GetInfo').then(() => { const accessRoutes = filterAsyncRoutes(constantRoutes.concat(asyncRoutes), roles) accessRoutes.forEach(route => { router.addRoute(route) }) next({ ...to, replace: true }) }).catch(err => { console.error(err) next(`/login?redirect=${to.path}`) }) } else { next() } }) function filterAsyncRoutes(routes, roles) { const res = [] routes.forEach(route => { const tmp = { ...route } if (hasPermission(roles, tmp)) { if (tmp.children) { tmp.children = filterAsyncRoutes(tmp.children, roles) } res.push(tmp) } }) return res } ``` --- #### Mock 数据模拟 (`mock/user.js`) 为了测试目的,在开发阶段可以通过 mock 接口伪造服务端响应的数据形式。这有助于开发者快速调试业务逻辑而无需依赖真实的 API 提供方[^3]。 样例行文如下所示: ```javascript // mock/user.js module.exports = [ { url: '/user/routers', // 获取用户可访问的路由资源 type: 'get', response: config => { return { code: 200, data: [{ path: '/', redirect: '/dashboard', children: [{ name: 'Dashboard', path: 'dashboard' }] }, { path: '/example', meta: { title: 'Example Menu' }, children: [{ name: 'Table Example', path: 'table' }] }] } } } ] ``` --- #### 存储路由信息 (`src/store/modules/permission.js`) Vuex State 管理着整个应用的状态树,因此也将用户的个性化路由保存在这里以便全局共享使用。 操作步骤概述为: 1. 定义初始状态变量用于记录所有可用选项及其子项集合; 2. 创建 Action 函数执行网络通信动作抓取远程数据库中的实际值; 3. Commit Mutation 更新本地缓存副本反映最新变化情况; 简化版实现方式如下所列: ```javascript // src/store/modules/permission.js const state = { routes: [], addRouters: [] }; const mutations = { SET_ROUTES(state, routes) { state.addRouters = routes; state.routes = [...constantRoutes, ...routes]; } }; const actions = { async GenerateRoutes({ commit }) { try { const res = await fetch('/api/getUserPermissions'); // 替换为真实接口 const accessedRoutes = filterRoutes(res.data); commit('SET_ROUTES', accessedRoutes); return Promise.resolve(accessedRoutes); } catch (error) { throw error; } } }; ``` --- #### 总结说明 综上所述,vue-element-admin动态路由主要依靠以下几个方面协同工作完成最终效果呈现: - **前端初始化** 静态声明基础导航条目作为入口引导; - **后端交互** 请求特定账户专属定制化链接清单; - **运行时期间适配调整** 根据实际情况实时增删改查节点关系图谱; 以上便是围绕此主题展开的技术剖析文档内容概览! ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值