如图,我猜测是路由跳转的时候,还没有注入响应的路由,然后第二次访问时已经生成好路由了。
虽然可以正常访问页面,但这个报错看着很不舒服,下面是我的代码,希望大神看看哪里写的有问题
//路由完全注册标识
let routeFlag = false
router.beforeEach((to, from, next) => {
const hasToken = localStorage.getItem('token')
if (hasToken) {
if (routeFlag) {
next()
} else {
// 注册动态路由
store
.dispatch('userModule/ASYNC_ROUTER')
.then(() => {
genRouteConfig().then(() => {
routeFlag = true
next({ ...to, replace: true })
})
})
.catch(() => {
localStorage.removeItem('token')
next(`/login?redirect=${to.path}`)
})
}
}
//动态生成路由
const genRouteConfig = () => {
const getMenus: newMenustype = store.getters['userModule/getMenus']
return new Promise((resolve, reject) => {
router.addRoute({
path: '/:catchAll(.*)',
redirect: '/404',
name: 'NotFound'
})
for (let key in getMenus) {
let menusObj = getMenus[key]
const routerObj: RouteRecordRaw = {
path: '/' + menusObj.name,
name: menusObj.name,
component: () => import('@/views/homepage/homepage.vue'),
children: []
}
if (menusObj.children) {
routerObj.redirect = `/${menusObj.name}/${menusObj.children[0].name}`
for (let i = 0; i < menusObj.children.length; i++) {
let menuName: string = menusObj.children[i].name
if (routerObj.children) {
routerObj.children.push({
path: menuName,
name: menuName,
component: modules[`./views/${menusObj.name}/${menuName}.vue`]
})
}
}
}
router.addRoute(routerObj)
}
resolve(true)
})
}
如果当前路由是动态追加的,
beforeEach
第一次执行的时候,这个路由还没追加进去,那么路由的matched
为空,就会报这个警告。解决办法,在
router/index.ts
文件里,也就是初始化路由的文件里,注册好 404 路由,这样第一次执行beforeEach
的时候匹配不到路由,就会匹配已经有的 404 路由,matched
里就不是空的了,就没有警告了。router/index.ts: