vue 权限路由动态加载
1.正常的思路前端把常用的路由和需要后端权限的路由分开,然后需要权限的路由又后端直接返回数据,前端处理成路由动态加载的数据。
后端返回的数据:
let menuList = [{
"id": "5fd1d86a8bf1c51a5cc1a76d",
"path": "/test",
"component": "Layout",
"name": "test",
"redirect": "/test/admin",
"hidden": false,
"meta": {
"title": "合作商管理",
"roles": ["admin"],
"icon": "test",
"noCache": true
},
"children": [{
"id": "5fd1d86a8bf1c51a5cc1a76e",
"path": "admin",
"component": "/test/index",
"name": "test",
"hidden": false,
"meta": {
"title": "合作商列表",
"roles": ["admin"],
"icon": "partner",
"noCache": true
}
}]
}]
2.前端需要把这个数据变成路由动态加载
let filterRouters = filterAsyncRouter(menuList)
//遍历后台传来的路由字符串,转换为组件对象
function filterAsyncRouter (routes) {
const accessedRouters = routes.filter(route => {
if (route.component === 'Layout') {
route.component = Layout
} else {
if (route.path.indexOf(':') > -1) {
const component = route.component
route.component = resolve => require([`@/views${component}`], resolve)
// route.component = () => import(`@/views${route.component.substr(0, route.component.indexOf(':') - 1)}`)
}
else {
const component = route.component
route.component = resolve => require([`@/views${component}`], resolve)
// route.component = () => import(`@/views${component}`)
}
}
if (route.children && route.children.length) {
route.children = filterAsyncRouter(route.children)
}
return true
})
return accessedRouters
}
3.添加路由
router.options.routes = store.getters.routes
router.addRoutes(store.getters.routes)
next({ ...to, replace: true }
说明:
1.在2中标红的地方是因为webpack 版本不一样,导致用import 加载不了,这块研究了半天。
参考文案:https://www.cnblogs.com/mark5/p/12101906.html

浙公网安备 33010602011771号