Vue3+vite addRoute动态路由刷新空白页面

Pinia

actions: {
    async ReTrigger() {
      let routes = await mapMenuToRouter(this.menu);
      for (const item of routes) {
        router.addRoute("main", item);
      }
    },
  },
//this.menu 后端菜单

vite动态加载组件+递归匹配权限组件

export async function mapMenuToRouter(useMenu) {
  const routes = [];
  const allRoutes = [];
  const routesFiltes = import.meta.glob("../router/main/**/*.js");
  for (const path in routesFiltes) {
    // routesFiltes[path]().then((mod) => {
    //   allRoutes.push(mod.default);
    // });
    let mod = await routesFiltes[path]();
    allRoutes.push(mod.default);
  }
  // console.log(allRoutes);
  // console.log(useMenu);
  const _recurseGetRoute = (useMenu) => {
    // console.log(useMenu);
    for (const menu of useMenu) {
      if (menu.type === 2) {
        const route = allRoutes.find((route) => {
          return route.path === menu.url
        });

        if (route) routes.push(route);
      } else {
        _recurseGetRoute(menu.children);
      }
    }
  };
  _recurseGetRoute(useMenu);
  return routes;
}

路由前置导航守卫

let hasRoles = true;
router.beforeEach(async (to, from) => {
  const store = useStore();
  let token = LoaclCache.getCache("token");
  let userMenus = LoaclCache.getCache("userMenus");
  if (to.path !== "/login") {
    if (token) {
      if (hasRoles) {
        await store.login.ReTrigger();
        hasRoles = false;
        return `${to.path}`;
        // router.push({...to})
      } else {
        return true;
      }
    } else {
      return "/login";
    }
  } else {
    return true;
  }
});
//记得添加404页面
{ path: "/:pathMatch(.*)*", name: "NotFound", component: NotFound },//动态路由报错,|| 匹配到404路由

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值