Iview-admin: 请教各位大佬以及作者,动态路由生成的菜单切换tab页时,页面内容会刷新

Created on 23 Jan 2018  ·  17Comments  ·  Source: iview/iview-admin

在切换至动态路由生成的菜单时,tab页内容会刷新;切换至原来写死在router.js中的路由打开的tab页不会刷新。
小弟求解,如何才能切换至动态路由生成的菜单打开的tab页也不刷新呢! @lison16

Most helpful comment

在vue实例里把name加上,对应router里的

All 17 comments

我是使用的addRoutes更新的路由,

                    this.getRequest('/menu/menuDataByUser').then(resp=>{
                        var menus = resp.data;
                        localStorage.setItem("menuItem",JSON.stringify(menus));//把菜单数据保存至localstorage
                        var router_arr = this.getMenuItem(menus);//解析菜单数据getMenuItem方法在下方

                        let tagsList = [];
                        router_arr.map((item) => {
                            if (item.children.length <= 1) {
                                tagsList.push(item.children[0]);
                            } else {
                                tagsList.push(...item.children);
                            }
                        });
                        this.$router.addRoutes(router_arr);
                        this.$store.commit('updateMenulist',router_arr);//更新菜单列表
                        this.$store.commit('setTagsList', tagsList);//把获取的菜单,添加到store/modules/app中tagsList,util.js中openNewPage用到。
                        this.$store.commit('setRouters',router_arr);//把路由添加到store的app中的router中去。
                        this.$router.push({
                            name: 'otherRouter'
                        });
                    });

getMenuItem方法如下:

    getMenuItem(data) {//解析菜单数据
        let yjMenuList= data.yjMenu;//一级菜单
        let ejMenuList= data.ejMenu;//二级菜单
        let router_arr = [];//路由数据

        for(let i=0;i<yjMenuList.length;i++) {
            let yj = yjMenuList[i];
            let child_arr = [];
            for( let j=0;j<ejMenuList.length;j++) {
                let ej = ejMenuList[j];
                if(yj.ZYID === ej.SJZYID) {
                    let path = ej.ZYLJ;
                    child_arr.push(
                        {
                            path: ej.TITLE,
                            title: ej.ZYMC,
                            name: yj.TITLE+"_"+ej.TITLE,
                            component: resolve => { require(['@/views/'+path+'.vue'], resolve); }
                        }
                    );
                }
            }
            router_arr.push(
                {
                    path: '/'+yj.TITLE,
                    icon: 'key',
                    name: yj.TITLE,
                    title: yj.ZYMC,
                    component: resolve => { require(['@/views/Main.vue'], resolve); },
                    children:child_arr
                }
            );
        }
        return router_arr;
    },

对 我也有这个问题 在一个页面编辑好数据 切换tab后数据就会丢失

@LSmile1994 动态生成的路由在进入某个tab路由后是404吗

在vue实例里把name加上,对应router里的

@LouisGo 感谢,问题终于解决了。原来我之前的name一直不对应

@LSmile1994 能否看看你的动态路由 我的菜单是根据登陆Id获取的

@LSmile1994 请问您编译时不会报错吗:
component: resolve => { require(['@/views/'+path+'.vue'], resolve); }

@codeItachi 根据什么获取的无妨,主要是你获取到菜单集合之后要进行相应的解析,我的解析菜单代码如下
getRouterItem(data){
let yjMenuList= data.yjMenu;//一级菜单
let ejMenuList= data.ejMenu;//二级菜单
let sjMenuList= data.sjMenu;//三级菜单
let router_arr = [];//路由数据

        for(let i=0;i<yjMenuList.length;i++) {
            let yj = yjMenuList[i];
            let child_arr = [];
            for( let j=0;j<ejMenuList.length;j++) {
                let ej = ejMenuList[j];
                if(yj.ZYID === ej.SJZYID) {
                    let path = ej.ZYLJ;//二级菜单的路径
                    let child_child_arr = []//三级路由的集合
                    for( let n = 0;n<sjMenuList.length;n++){
                        let sj = sjMenuList[n];
                        if(ej.ZYID === sj.SJZYID){
                            let child_path = sj.ZYLJ;
                            child_child_arr.push(
                                {
                                    path: sj.TITLE,
                                    title: sj.ZYMC,
                                    name: sj.TITLE,
                                    component: resolve => { require(['@/views/'+child_path+'.vue'], resolve); }
                                }
                            );
                        }
                    }
                    if (child_child_arr.length>0) {
                        router_arr.push(
                            {
                                path: ej.TITLE,
                                title: ej.ZYMC,
                                name: ej.TITLE,
                                component: resolve => { require(['@/views/Main.vue'], resolve); },
                                children:child_child_arr
                            }
                        );
                    }else{
                        child_arr.push(
                            {
                                path: ej.TITLE,
                                title: ej.ZYMC,
                                name: ej.TITLE,
                                component: resolve => { require(['@/views/'+path+'.vue'], resolve); }
                            }
                        );
                    }
                }
            }
            router_arr.push(
                {
                    path: '/'+yj.TITLE,
                    icon: 'key',
                    name: yj.TITLE,
                    title: yj.ZYMC,
                    component: resolve => { require(['@/views/Main.vue'], resolve); },
                    children:child_arr
                }
            );
        }
        return router_arr;
    },

@linziguan 你看下我上面发的这个解析菜单的内容,我这么写解析不会报错的

@LSmile1994 当页面手动刷新的时候,动态路由怎么处理?

@qriv 在main.js页面写个钩子mounted刷新的时候重新获取一遍

大佬 能不能借鉴下你动态路由的部分,我现在登录进去的动态路由实现了,但是一刷新动态添加的路由就找不到了,我重新获取过也还是不行

@acecea 刷新路由找不到的问题解决了吗?能说一下解决思路不

我用了一个笨办法解决的,我是在404页面上做的文章,登陆成功后,我会先通过接口找到当前会员有权限访问的所有路由,然后存入sessionstore,假如用户刷新页面,那么肯定会跳转到404页面,在404页面上获取上一级路由,然后在sessionstore中找到这条路由,再重定向过去就好了。

你好,我这边也是根据后台数据生成菜单。但是用你上面的方法在登录页面获取菜单,拼接菜单数据,没有效果,菜单列表根本显示不出来QAQ。如果我在iview里面的router.js里面将appRouter赋值,虽然能出菜单,但是点击并没有链接到页面...求赐教啊

@LSmile1994 你上面说name对应就可以了,请问怎么对应的?我也遇到这样的问题,麻烦了

@LouisGo 感谢大佬,一直以自己的规则定义的name。想不到啊~

Was this page helpful?
0 / 5 - 0 ratings

Related issues

itpretty picture itpretty  ·  6Comments

tinnkm picture tinnkm  ·  4Comments

xinmowen picture xinmowen  ·  4Comments

ptlinyi picture ptlinyi  ·  4Comments

iMactool picture iMactool  ·  5Comments