vue3 vue-router4 报错 No match found for location with path

如图,我猜测是路由跳转的时候,还没有注入响应的路由,然后第二次访问时已经生成好路由了。
虽然可以正常访问页面,但这个报错看着很不舒服,下面是我的代码,希望大神看看哪里写的有问题
image.png

//路由完全注册标识
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)
    })
}
阅读 17.3k
2 个回答

如果当前路由是动态追加的,beforeEach 第一次执行的时候,这个路由还没追加进去,那么路由的 matched 为空,就会报这个警告。
解决办法,在 router/index.ts 文件里,也就是初始化路由的文件里,注册好 404 路由,这样第一次执行 beforeEach 的时候匹配不到路由,就会匹配已经有的 404 路由,matched 里就不是空的了,就没有警告了。

router/index.ts:

import { createRouter, createWebHistory, RouteRecordRaw } from 'vue-router'

const routes: Array<RouteRecordRaw> = [
    {
        path: '/:catchAll(.*)',
        name: '404',
        component: () => import('@/views/error/index.vue')
    }
]

const router = createRouter({
    history: createWebHistory(process.env.BASE_URL),
    routes
})

export default router
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏