问题:
使用了panjiachen的模版: vue-admin-template,做的后台管理系统。(http://panjiachen.github.io/vue-admin-template)
在配置权限的时候,动态添加路由之后:
SET_RESULTASYNCROUTES: (state, routes) => {
state.resultAsyncRoutes = routes
state.resultAllRoutes = constantRoutes.concat(state.resultAsyncRoutes, anyRoutes)
//给路由器添加新路由
router.addRoutes(state.resultAllRoutes) // 动态添加路由:不执行上会跳转失败:路由更新之后,需要重新调用此
}
手动去刷新页面时会出现空白:
原因分析:
看路由信息,动态路由加进去了,但是在页面刷新后,页面中的路由等信息被重新初始化,但并不等同于项目重启,动态路由添加的内容未被执行,导致只保留了固定路由的部分,所以页面刷新后,会重定向到404界面
解决方法
前置守卫router.beforeEach()配置时候,在异步try-catch里面的next(),改成:
next({...to,replace:true})
或者:next({...to})
//next()->nex({...to,replace:true}) 前置路由守卫
router.beforeEach(async (to, from, next) => {
// start progress bar
console.log('..to', to)
NProgress.start()
// set page title
document.title = getPageTitle(to.meta.title)
// determine whether the user has logged in
const hasToken = getToken()
if (hasToken) {
if (to.path === '/login') {
// if is logged in, redirect to the home page
next({path: '/'})
NProgress.done()
} else {
const hasGetUserInfo = store.getters.name
if (hasGetUserInfo) {//已经有用户信息
next()
} else {//未有用户信息
try { //异步try catch
// get user info
console.log('需要先截取token')
await store.dispatch('user/getInfo')
next({...to,replace:true}) //重新进入to界面,replace: true表示浏览器不需要记录本次历史
} catch (error) {
// remove token and go to login page to re-login
await store.dispatch('user/resetToken')
Message.error(error || 'Has Error')
next(`/login?redirect=${to.path}`)
NProgress.done()
}
}
}
} else {
/* has no token*/
if (whiteList.indexOf(to.path) !== -1) {
// in the free login whitelist, go directly
next()
} else {
// other pages that do not have permission to access are redirected to the login page.
next(`/login?redirect=${to.path}`)
NProgress.done()
}
}
})
注:设置 replace
属性的话,当点击时,会调用 router.replace()
而不是 router.push()
,于是导航后不会留下 history 记录。