vue添加动态路由踩坑
前几天朋友问我一个问题 vue 角色权限区分添加动态路由时刷新 动态组件不加载是啥子情况,于是踏上了一行行找问题的路…
好吧我承认,作为一个小白整整用了一天的时间才找到问题…
话不多说,直接po代码
vuex部分
state: { userInfo: userinfo,
routers: constantRouterMap,
addRouters: []
},
mutations: {
setUserInfo (state, userInfo) {
state.userInfo = userInfo
},
SET_ROUTERS: (state, routers) => {
console.log()
state.addRouters = routers
state.routers = constantRouterMap.concat(routers)
}
},
actions: {
GenerateRoutes ({ commit }, data) {
const { roles } = data
const accessedRouters = asyncRouterMap.filter(v => {
if (roles.indexOf('admin') >= 0) return true
if (hasPermission(roles, v)) {
if (v.children && v.children.length > 0) {
v.children = v.children.filter(child => {
if (hasPermission(roles, child)) {
return child
}
return false
})
return v
} else {
return v
}
}
return false
})
commit('SET_ROUTERS', accessedRouters)
}
},
getters: {
addRouters: state => state.routers
}
router部分
export const constantRouterMap = [ {
path: '/',
component: Home
},
{
path: '/test',
component: Test
}
]
export const asyncRouterMap = [
{
path: '/power',
name: 'power',
meta: {
// 标记需要登录
auth: true,
role: ['admin', 'user', 'superadmin']
},
component: Power,
},
// 重定向
{ path: '*', redirect: '/404', hidden: true }
]
let router = new Router({
mode: 'history',
routes: constantRouterMap
})
router.beforeEach((to, from, next) => {
if (store.state.userInfo.token) {
const roles = store.state.userInfo.role
store.dispatch('GenerateRoutes', { roles }).then(() => { // 生成可访问的路由表
router.addRoutes(store.getters.addRouters) // 动态添加可访问路由表
next()
})
} else {
if (to.path === '/about') {
MessageBox.alert('未登录状态下不能进入此模块', '提示', {
confirmButtonText: '确定',
callback: action => {
next({
path: '/'
})
}
})
} else {
next()
}
}
})
export default router
敲黑板划重点了!!!
果然按照如我那位朋友所说,开始进入没有任何问题,但是一刷新动态路由所在页面就会出现页面空白的现象了…
开始进入页面时没有问题
刷新当前页面就会出现下图不加载视图的问题了
冥思苦想之后终于找到问题所在了,如图
怪只怪自己没有好好看官方文档
当一个导航触发时,全局前置守卫按照创建顺序调用。守卫是异步解析执行,此时导航在所有守卫 resolve 完之前一直处于 等待中。
虽然也想到了是不是因为动态路由没有加载就已经跳转了,但是却默默的加了个延迟…当然结果就是没有任何作用的,无奈,女生的第六感告诉我问题绝对在这里哈哈哈哈哈哈,没办法只能去官方文档里找问题,又刷了一遍router官方文档 (链接: 捷径点击这里.)
发现守卫本身就是异步解析执行的(此时内心真的是…),至此便解决了vue 角色权限区分添加动态路由时刷新 动态组件不加载的问题
前端小白第一次写博客,还需向各位大佬多多学习!
以上是 vue添加动态路由踩坑 的全部内容, 来源链接: utcz.com/z/376199.html