用addRoutes实现动态路由

有时候需要权限才能看到一些菜单,。这个时候路由就是动态的啦。我们改怎么处理呢?

一般的路由组件是这样写的。这样是写死的。所有的组件一旦登录进去大家都可以看到的。

用addRoutes实现动态路由

 

想要实现动态就把这些组件登录以后从新获取到把他加进去。

首先在登录的时候把所有的路由组件通过接口获取过来。下面是接口的数据。可以看到他和写在router.js里面的组件的定义格式是一样的。具有name path component

用addRoutes实现动态路由

 

login的登陆页面:

 import MenuUtils from '../common/js/MenuUtils';   //在这个组件里对路由进行了处理。

 // 获取权限

var pageRouters = [];        //存放路由的数组
                var powerParams = { userid: data.userid };
                getUserPowers(powerParams).then(retdata => {
                    this.logining = false;
                    let { msg, code, data } = retdata;
                    if (code !== 1) {
                        this.$message({
                            message: msg,
                            type: 'error'
                        });
                    } else {
                        sessionStorage.setItem('menus', JSON.stringify(data.menus));
                        sessionStorage.setItem('actions', JSON.stringify(data.actions));

                        // 清空
                        this.$router.options.routes.splice(0,this.$router.options.routes.length);
                        pageRouters.splice(0,pageRouters.length);

                        MenuUtils(pageRouters,data.menus);//执行完这个pageRouters里面就接收了接口里传来的所有的页面了
                        pageRouters.push({ path: '*', redirect: '/404', hidden: true });
                        pageRouters.forEach((item)=>{
                            this.$router.options.routes.push(item);  //  // 将请求的路由先存放到options对象中
                        });
                        this.$router.addRoutes(pageRouters);

MenuUtils.js页面

import LazyLoading from './LazyLoading'    //使用lazyLoading实现懒加载
export default (routers,data) => {
    //这里之所以要重新遍历一下,是因为,通常我们动态路由的时候,是获取服务端数据,这个component属性是一个字符串,或者可能连字段名都是其他的key
    //所以这里要做一些转换
    generaMenu(routers,data);
}
function generaMenu(routers,data){  //这里的routers是login页面
    data.forEach((item)=>{
        let menu = Object.assign({},item);
        var vuename = '';
        if(menu.component == 'Home' || menu.component == 'Login' || menu.component == 'Main' || menu.component == '404'){
            vuename = menu.component;//这几个页面都是主页面。
        }else{
            var tmpArr = menu.component.split("_");
            vuename = tmpArr[0] + '/' + tmpArr[1];  
        }
        // console.log(vuename);
        menu.component = LazyLoading(vuename);
        if(menu.children && menu.children.length > 0){
            menu.children = [];
            generaMenu(menu.children,item.children);
        }
        routers.push(menu);  //把所有的内容都放在了routers。也就是login页面的那个pageRouters里面
    });
}