vue3全局守卫和addroute实现动态路由

在vue后台管理系统这块,经常通过使用路由全局守卫beforeEach和addroute来实现动态挂载路由。这一块总的思路虽然很好理解,但是其中有很多细节需要注意。

问题一:addRoute只需使用一次

控制addRoute:声明一个布尔值registerRouteFresh ,初始值为TRUE,当registerRouteFresh 为TRUE时,路由进行挂载,挂载完毕之后,变为FALSE

let registerRouteFresh = true;

router.beforeEach(async (to, from, next) => {
  const account = window.localStorage.getItem('account');
  // 已经登录
  if (account) {
    // 第一次挂载路由
    if (registerRouteFresh) {
      if (account === 'admax') {
        routeadmin.forEach((i) => {
          router.addRoute(i);
        });
        window.localStorage.setItem('menu', JSON.stringify(routeadmin));
      }
      next({ ...to, replace: true });
      registerRouteFresh = false;
    } else {
      next();
    }
    // 没有登录,返回登录页面
  } else {
  }
});

问题二:next(路径)会造成无限循环

每一次导航路由的跳转,都会经过一遍路由全局守卫,如果直接去使用next(路径),就会不断进行路由判断,进入无限循环

比如:next(‘login’)返回登录页面

错误用法:

let registerRouteFresh = true;

router.beforeEach(async (to, from, next) => {
  const account = window.localStorage.getItem('account');
  // 已经登录
  if (account) {
    // 第一次挂载路由
    if (registerRouteFresh) {
      if (account === 'admax') {
        routeadmin.forEach((i) => {
          router.addRoute(i);
        });
        window.localStorage.setItem('menu', JSON.stringify(routeadmin));
      }
      //确保路由addroute执行完毕
      next({ ...to, replace: true });
      registerRouteFresh = false;
    } else {
      next();
    }
    // 没有登录,返回登录页面
  } else {
  	next('login');
  }
});

正确用法:

let registerRouteFresh = true;

router.beforeEach(async (to, from, next) => {
  const account = window.localStorage.getItem('account');
  // 已经登录
  if (account) {
    // 第一次挂载路由
    if (registerRouteFresh) {
      if (account === 'admax') {
        routeadmin.forEach((i) => {
          router.addRoute(i);
        });
        window.localStorage.setItem('menu', JSON.stringify(routeadmin));
      }
      next({ ...to, replace: true });
      registerRouteFresh = false;
    } else {
      next();
    }
    // 没有登录,返回登录页面
  } else {
    if (to.path === '/login') {
      next();
    } else {
      next('login');
      //next('login'):执行这一步时,进行路由守卫判断,正好to.path === '/login',从守卫中出来
    }
  }
});
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 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
发出的红包

打赏作者

Realistic-er

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值