在切换至动态路由生成的菜单时,tab页内容会刷新;切换至原来写死在router.js中的路由打开的tab页不会刷新。
小弟求解,如何才能切换至动态路由生成的菜单打开的tab页也不刷新呢! @lison16
我是使用的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。想不到啊~
Most helpful comment
在vue实例里把name加上,对应router里的