Vue 动态路由

实现动态路由,需要解决3个核心功能

1、router.addRoute 方法加路由

2、动态集成路由componentName:() => import(`@/pages/${view}`)

3、刷新后动态路由丢失问题

总体思路:

1、定义一个store对象,这个是vue里面的全局对象,刷新后值会丢失

2、登录后把数据库的菜单调用router.addRoute加到路由中,然后把菜单存本地localstore

3、router.beforeEach 里面判断是否登录,且store对象里面的值是否为空,然后直接重新去localstore再绑定一次路由,调用next({ ...to, replace: true });重来即可

1、2的实现代码如下:

//绑定动态路由
router.initRouter=(menuList)=>{
  var routerConfig={ path: '/', name: 'home', component: () => import('@/layouts/PageLayout'),
    children: [
      { path: "/404", name: '404', component: () => import('@/common/error/404'),
        meta: {
          //原组件的名称
          componentName: "Page404",
          //不需要登录
          needLogin: false
        }
      },
    ]
  };
  //循环数据库的菜单
  for(var menu of menuList){
    //没有数据的不绑定
    if(menu.component_path==undefined || menu.component_path ==null || menu.component_path=="" || menu.component_path=="null"){
      continue;
    }
    routerConfig.children.push({
      path: menu.url,
      component: loadComponent(menu.component_path),
      meta: {
        componentName: menu.component_name
      }
    });
  }
  router.addRoute(routerConfig);
  router.addRoute({path: '*',redirect: '/404', hidden: true });
  //动态路由加载完成
  store.state.menu.dynRouterLoaded = true;
}
//路由的插件
const loadComponent = (view) => {
  if(view.substring(0,1)=="/"){
    view=view.substring(1);
  }
  if (process.env.NODE_ENV === 'development') {
    return (resolve) => require([`@/pages/${view}`], resolve)
  } else {
    // 使用 import 实现生产环境的路由懒加载
    return () => import(`@/pages/${view}`)
  }
}

解决刷新丢失路由


//路由前置守卫
router.beforeEach((to, from, next) => {
  NProgress.start();
  //有登录且没有路由的时候,手动绑定一次路由,解决刷新菜单丢失问题
  if(getAuthorization()!=null&& store.state.menu.dynRouterLoaded==false){
    var localMenus = localStorage.getItem(process.env.ADMIN_MENUS_KEY)
    if (localMenus != null) {
       router.initRouter(JSON.parse(localMenus));
    }else{
      router.initRouter([]);
    }
    next({ ...to, replace: true });
  }
  
  if (to.meta.needLogin == false) {
    //不需要登录
    return next();
  }
  //没有token直接去登录页面
  if(getAuthorization()==null){
    return next({path: "/login"});
  }
  const homeUrl = MenuUtil.getHomeUrl();
  //解决回退时进入首页的BUG
  if (to.path == process.env.PATH && homeUrl != "") {
    return next({ path: homeUrl });
  }
  next()
});

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值