main.js 、login.vue、app.vue
需求: 权限分为A、B、C、D四个权限,分别对应不同的路由,对应不同的菜单,没有默认的显示菜单
思路:获取用户有哪些权限,路由动态加载;利用的是vue-router中的addRoutes实现的路由动态加载
坑1:在main,js中进行挂载一次,会导致,页面登录之后路由没有被挂载,因为登录之后,main.js并没有执行
如果在login.vue中只挂载一次的话,会导致,页面刷新的时候页面空白,路由没有被挂载,因为刷新之后,main.js被执行,路由被挂载的还是初始化的router
解决:分别在login.vue和main.js中添加动态路由
坑2:使用addRoutes,只是会将路由都添加进去,并没有判断是否匹配,是否会重复添加
解决:使用router.matcher过滤,已经加载过的路由可以过滤掉
代码:
(1)初始化的router.js
router.js 初始化的路由文件 const router= new Router({ // mode: 'history', routes: [ { path: '/login', name: 'login', component: login, meta:{icon:'team',title:'登录',} } ], }); // 去除警告,重复的路由 router.selfaddRoutes = function (params){ router.matcher = new Router( { // mode: 'history', routes: [ { path: '/login', name: 'login', component: login, meta:{icon:'team',title:'登录',} }, { path:'*', name:'no', redirect:'/' } ], } ).matcher; router.addRoutes(params) } export default router;
(2)根据权限需添加的路由
export default function () { // 获取token 并解析 const decoded = getSession() && jwt_decode(getSession()) const { AccessGroups } = decoded && decoded.admin || []; let new_route = { path: '/', name: 'main', component: main, redirect: {}, children: [] } // 动态添加路由 AccessGroups.indexOf(1) > -1 && new_route.children.push(A) AccessGroups.indexOf(2) > -1 && new_route.children.push( B) AccessGroups.indexOf(3) > -1 && new_route.children.push( C) AccessGroups.indexOf(4) > -1 && new_route.children.push( D) new_route.redirect.name = new_route.children[0].name; router.options.routes[1] = new_route router.selfaddRoutes([new_route]) }
(3)分别在login和main.js中调用