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})
}

相关推荐

  1. VUE3中路常用配置及常见问题解决方法

    2024-02-09 10:50:03       57 阅读
  2. vue3中路守卫的快速上手

    2024-02-09 10:50:03       61 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-02-09 10:50:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-02-09 10:50:03       100 阅读
  3. 在Django里面运行非项目文件

    2024-02-09 10:50:03       82 阅读
  4. Python语言-面向对象

    2024-02-09 10:50:03       91 阅读

热门阅读

  1. Vivado用ILA抓波形保存为CSV文件

    2024-02-09 10:50:03       48 阅读
  2. c#通过ExpressionTree 表达式树实现对象关系映射

    2024-02-09 10:50:03       41 阅读
  3. 38. C++ 引用的本质

    2024-02-09 10:50:03       47 阅读
  4. 序列化和反序列化、pytest-DDT数据驱动

    2024-02-09 10:50:03       50 阅读
  5. 2024.2.6

    2024-02-09 10:50:03       48 阅读
  6. 面试复盘——10

    2024-02-09 10:50:03       53 阅读
  7. Git入门

    Git入门

    2024-02-09 10:50:03      54 阅读
  8. 单片机精进之路-2led灯闪烁

    2024-02-09 10:50:03       56 阅读
  9. Rust语言入门(第3篇)

    2024-02-09 10:50:03       50 阅读
  10. Rust安装——Win10

    2024-02-09 10:50:03       53 阅读