本文介绍: Vue3中路由配置Catch all routes (“*”) must …..问题及处理方式
Vue3中路由配置Catch all routes (“*”) must …问题
文章目录
1. 业务场景描述
1. 加载并添加异步路由场景
从vue2项目转换为Vue3项目时,路由导航守卫中加载后端返回的动态路由,并配置未识别的路由自动跳转指定错误页面(如404页面)时,出现了
ue-router.mjs:1321 Uncaught (in promise) Error: Catch all routes ("*") must now be defined using a param with a custom regexp
的问题
2. vue2中加载并添加异步路由(OK)
Vue2中路由导航守卫中加载动态路由案例代码如下
let asyncRouter = []
// 路由导航守卫中,加载动态路由
router.beforeEach((to, from, next) => {
if (whiteList.indexOf(to.path) !== -1) {
next()
} else {
const token = tokenStore.get('token')
if (token) {
dbApi.getRouter({}).then((response) => {
const res = response.data
asyncRouter = res.data
asyncRouter.push({
component: "error/404",
name: "404",
path: "*" //问题主要出现在这里
});
store.commit('setRouters', asyncRouter)
goTo(to, next,asyncRouter)
})
} else {
if (to.path === '/') {
next()
}
}
}
})
router.afterEach(() => {
//....
})
function goTo(to, next,asyncRouter) {
router.addRoutes(asyncRouter) //注意这里时Vue2中添加路由的方法,与Vue3有所区别
next({...to, replace: true})
}
3. 转vue3后不好使(Error)
1. 代码
let asyncRouter = []
// 路由导航守卫中,加载动态路由
router.beforeEach((to, from, next) => {
if (whiteList.indexOf(to.path) !== -1) {
next()
} else {
const accountStore = useAccountStore();
const token = accountStore.token
if (token) {
dbApi.getRouter({}).then((response) => {
const res = response.data
asyncRouter = res.data
asyncRouter.push({
component: "error/404",
name: "404",
path: "*" //问题主要出现在这里
});
store.commit('setRouters', asyncRouter)
goTo(to, next,asyncRouter)
})
} else {
if (to.path === '/') {
next()
}
}
}
})
router.afterEach(() => {
//....
})
function goTo(to, next,asyncRouter) {
asyncRouter.forEach((route) => {
router.addRoute(route) //注意这里vue3添加路由方式,与Vue2有所区别
})
next({...to, replace: true})
}
2. 错误
详细信息如下
vue-router.mjs:1321 Uncaught (in promise) Error: Catch all routes ("*") must now be defined using a param with a custom regexp.
See more at https://next.router.vuejs.org/guide/migration/#removed-star-or-catch-all-routes.
at Object.addRoute (vue-router.mjs:1321:23)
at Object.addRoute (vue-router.mjs:2986:24)
at index.ts:119:16
at Array.forEach (<anonymous>)
at go (index.ts:117:17)
at index.ts:93:25
2. 处理方式
未识别的路由自动跳转指定错误页面(如404页面)时,将路由中的path配置
{ path: "*"}
改为{path: "/:catchAll(.*)"}
即可
1. 修改前
asyncRouter.push({
component: "error/404",
name: "404",
path: "*"
});
2. 修改后
asyncRouter.push({
component: "error/404",
name: "404",
path: "/:catchAll(.*)"
});
3. vue3中完整代码案例
let asyncRouter = []
// 路由导航守卫中,加载动态路由
router.beforeEach((to, from, next) => {
if (whiteList.indexOf(to.path) !== -1) {
next()
} else {
const accountStore = useAccountStore();
const token = accountStore.token
if (token) {
dbApi.getRouter({}).then((response) => {
const res = response.data
asyncRouter = res.data
asyncRouter.push({
component: "error/404",
name: "404",
path: "/:catchAll(.*)"
});
store.commit('setRouters', asyncRouter)
goTo(to, next,asyncRouter)
})
} else {
if (to.path === '/') {
next()
}
}
}
})
router.afterEach(() => {
//....
})
function goTo(to, next,asyncRouter) {
asyncRouter.forEach((route) => {
router.addRoute(route) //注意这里是vue3添加路由方式,与Vue2有所区别
})
next({...to, replace: true})
}
原文地址:https://blog.csdn.net/yuanjinshenglife/article/details/136076138
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_68089.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。