vue3动态路由addRoute

Vue2中,有两种方法实现路由权限动态渲染:

  router.addRoute(parentOrRoute, route)    //添加单个
  router.addRoutes(routes)                  //添加多个

但在Vue3中,只保留了 addRoute() 方法。

首先,假设路由如下:

const menu = [{
  id: 'system-manage',
  name: 'system-manage',
  path: '/system',
  meta:{
    title: '系统管理',
    icon: 'setting',
  },
  compoent: 'layout',
  children: [
    {
      id: 'role',
      name: 'role',
      path: '/system/role',
      meta:{
        title: '角色管理',
        icon: 'user-filled',
      },
      compoent: 'view/system/role',
      children: []
    }
  ]
}]
// 递归替换引入component
function dynamicRouter(routers) {
  const list = []
  routers.forEach((itemRouter,index) => {
    list.push({
      ...itemRouter,
      component: ()=>import(`@/${itemRouter.component}`)
    })
    // 是否存在子集
    if (itemRouter.children && itemRouter.children.length) {
      list[index].children = dynamicRouter(itemRouter.children);
    }
  })

  return list
}

// 防止首次或者刷新界面路由失效
let registerRouteFresh = true
router.beforeEach((to, from, next) => {
  if (registerRouteFresh) {
    // addRoute允许带children添加,所以循环第一层即可
    dynamicRouter(menu).forEach((itemRouter) => {
      router.addRoute(itemRouter)
    })
    next({ ...to, replace: true })
    registerRouteFresh = false
  } else {
    next()
  }
})

使用这种拼接的方式会导致全局scss多次注入错误,而且需要后台返回文件路径。
scss报错

所以改用以下方式:

// 在本地建一个路由表
const path = [{
  path: '/system/role',
  name: '角色管理',
  component: () => import('@/views/system/role')
}]

function dynamicRouter(routers) {
  const list = []
  routers.forEach((itemRouter,index) => {
    // 从本地找组件
    const authRoute = path.find(i=>i.path==itemRouter.path)
    list.push({
      ...itemRouter,
      component: authRoute?.component || Layout //没找到则用默认框架组件
    })
    // 是否存在子集
    if (itemRouter.children && itemRouter.children.length) {
      list[index].children = dynamicRouter(itemRouter.children);
    }
  })

  return list
}

如果出现 Error: Invalid route component ,看下路径是否正确,还有 addRoute 里传的是否是对象,一开始传了数组导致找了半天(扶额

Invalid route
以上。

  • 5
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue3中,可以使用router.addRoute()方法来实现动态路由的添加。这个方法可以接受两个参数,第一个参数可以是父级路由对象或者父级路由的路径,第二个参数是要添加的路由对象。通过调用这个方法,可以动态地向路由中添加单个路由。\[1\] 以下是一个示例代码,展示了如何在Vue3中使用addRoute()方法实现动态路由的添加: ```javascript import { createRouter } from 'vue-router' const router = createRouter({ // 路由配置 }) // 添加单个路由 const route = { path: '/dynamic', name: 'Dynamic', component: () => import('@/views/Dynamic.vue') } router.addRoute(route) export default router ``` 在上面的代码中,我们首先创建了一个路由实例,然后定义了一个要添加的路由对象。最后,通过调用addRoute()方法将这个路由对象添加到路由中。 需要注意的是,在Vue3中,使用addRoute()方法添加的路由会立即生效,无需重新创建路由实例或调用其他方法。这样,新添加的路由就可以在页面上进行渲染了。 希望这个回答对你有帮助! #### 引用[.reference_title] - *1* *3* [vue3动态路由addRoute](https://blog.csdn.net/m0_49343686/article/details/123959075)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [vue3 使用addRoute动态添加路由,兼解决刷新空白或跳到404页面问题](https://blog.csdn.net/YSQ_qsy/article/details/122042229)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值