【记录】【vue】动态路由添加

​​

一、动态路由

        最近接到一个需求,不需要在router配置文件里手动注册路由,点击菜单时,根据菜单上的地址,自动添加路由,跳转。(他们说我不管,反正菜单信息给你了,页面我写好了,但是我就不配路由,我懒得配,你自己想办法跳转.......................)

(我只是个小白啊喂!!)

看下官网怎么说(API 参考 | Vue Router (vuejs.org));

【记录】【vue】动态路由添加

【记录】【vue】动态路由添加

 

 

二、创建

1 全局

        我做了两种方法,一种是登录之后我可以获取到全部的菜单的信息,将获取的菜单信息做个处理,处理成标准的路有对象,然后在app.vue的created生命周期中动态添加;

        个人觉得处理过程可能麻烦点,因为毕竟可能children里还有children,children里还有children...所以用到了递归,递归写不好的话,一不小心就会死循环...

        不展示了,中国人不骗中国人,我实现了,但是递归那代码写的不太好,脸就一张,我省着点丢,看下面那个实现方法吧,比这个要简单。

【记录】【vue】动态路由添加

2 路由守卫

第二种是在路由守卫里做,如下:

//我觉得这么些方法放在路由对象里看着过于繁琐,且乱,
//所以将方法拿出来封装了一个RouterService类,下面的这些方法就是写在这个类里的
//然后在路由守卫里调用RouterService.routerGuard就可以了,我就不放全部的代码啦
//参数中的router就是项目中router对象  
routerGuard(router, to, from, next) {
        let comp_name = to.path.split("/dyn/");
        if(comp_name[1]&&comp_name[1]!="/"){
            let new_route = this.generateRoutesV2(to.path);
            //检查之前是不是已经添加过了
            //如果没有添加过就执行添加操作
            if(!this.hasRoute(new_route.name)){
                router.options.routes.push(new_route);
                router.addRoute("home",new_route);
                next(new_route.path)
            }
        }
        next();
    }
    //根据新路由的name判断routes中是否已经存在此路由
    hasRoute(name){
        let routes = vueRouter.options.routes;
        let flag = routes.some(item=>{
            return item.name==name
        })
        return flag
    }

    //加载组件
    loadView(view) {
        if (view) {
            return () => import('@/views/' + view)
        }
    }
    //根据path生成标准路由对象
    generateRoutesV2(path){
        //根据路径生成name,构建引入component的路径
        let name = path.split("/")[path.split('/').length-1];
        let comp_name = path.split("/dyn/")[1];
        let route_obj={
            path:path,
            name:name,
            component:this.loadView(comp_name)
        }
        return route_obj
    }

注意

使用addRoute时需要注意以下几点:(过程中我碰到的问题及总结)

1、路径须带上父路径,即路径写全;(这个我不确定是不是绝对正确)
2、使用addRoute动态添加后,不会在router.options.routes中显示,必须手动往router.options.routes中注册动态添加的路径才会显示
3、使用addRoute有两个参数,第一个是父路径的name,第二个是需要动态添加的路由项;
如果不写第一个参数,跳转路由时,页面并不会显示在父页面的router-view中,而是会重新打开一个新页面。

好,就酱,如有错误欢迎指出,词不达意还请见谅。(忽略我的代码质量,我还在学习进步中)

哦,我用的路由版本是3.2的版本,注意addRoutes在vue router 3中已经不支持了

【记录】【vue】动态路由添加

上一篇:路由及路由守卫


下一篇:vue3组件间传值