vue3 router.addRoute() 动态加载路由,页面刷新后失效

382 阅读1分钟

组件版本

{
  "vue": "^3.5.13",
  "vue-router": "^4.5.0"
}

问题

项目通过动态的权限校验进行路由的增删,在 vue3 中使用addRoute添加路由后,刷新页面后不生效。

分析

刷新页面后报错,未发现路径未"xxxx"的路由,网上也有很多类似的问题。

vueRouter 中该报错未添加/配置该类型路由。

怀疑在路由守卫中进行权限判断时,动态路由加载还未完成。

No match found for location with path "xxxx"

每次浏览器按钮刷新都会执行一遍 main.js

实现 initRouter 函数在 app.use(router) 调用

1、实现 initRouter 函数

const initRouter = async () => {
  // 此部分为一个返回路由定义的数组,数组有不同路由对象组成
  // 一般根据调接口获取路由权限动态生成
  const res = [
    user, list
  ]
  res.forEach((route) => {
    router.addRoute(route)
  })
}

2、在 app.use(router) 前调用

// 保证在 app.use(router) 前调用接行
// 可通过配置文件引入
await initRouter()

完整代码

// 动态授权,需要身份验证才能访问的路由
const initRouter = async () => {
  const res = [
    user, list
  ]
  res.forEach((route) => {
    router.addRoute(route)
  })
}
// 此处不使用 await 语法也未报错,但路由的增删除基本是异步的
await initRouter()
// 全局路由守卫
router.beforeEach(async (to, from) => {
  const hasToken = getToken()
  if (hasToken) {
    // 业务逻辑
  } else {
    // 业务逻辑
  }
})