使用 antd-admin vue版本发现退出无刷新重新登陆后会保持上一个用户的菜单。

BigPolo
  • 80

使用 antd-admin vue版本发现退出重新登陆后会保持上一个用户的菜单。
看了下代码,发现一段这个。
`
function filterMenu(menuData, permissions, roles) {

menuData.forEach(menu => {

if (menu.meta && menu.meta.invisible === undefined) {
  menu.meta.invisible = !hasAuthority(menu, permissions, roles)
  if (menu.children && menu.children.length > 0) {
    filterMenu(menu.children, permissions, roles)
  }
}

})
`
判断invisible === undefined 然后给invisible赋值。那无刷新退出登陆后invisible自然就不存在undefined的值了,所以会保持上一次的结果。但是把invisible === undefined这个判断去掉之后 还是有问题。
估计路由里面是用是否有invisible这个值来判断是否是被服务端控制的。

所以这个问题要怎么解决呢?

回复
阅读 454
4 个回答

这样的问题有两种解决办法:
方案一:location.reload刷新页面
在登录成功之后,使用location.reload()刷新一下页面,应该问题会解决。
但这种方法会影响体验感。算是有瑕疵的解决方案。

另外就是可以在退出登录或者token失效返回到login页面的时候,使用location.reload()刷新一下login页面,从而清除router缓存,重新再加载路由。这种方案应该比在登录之后跳转页面刷新体验要好一些。(针对cookie或者localstorage这种token存储方式的项目,不退出,直接关闭页面应该会有些许瑕疵)

    if (this.$store.getters.addRouters.length > 0) { // 判断是否已经刷新
          location.reload()
    }

方案二: 重置matcher
(1)在router中定义重置路由的方法

const createRouter = () => new VueRouter({
        mode: 'hash',
        routes: constantRoutes,
        scrollBehavior: () => ({ y: 0 })
});
const router = createRouter();
export function resetRouter() {
  const newRouter = createRouter()
  router.matcher = newRouter.matcher // reset router
}

然后在退出登录logout中使用 resetRouter()重置路由。
(2)在addRoutes加载路由之前重置matcher


resetRouter()   //重置路由
router.addRoutes(store.getters.addRouters)  //加载路由

filterMenu方法的 menuData 是接口查询出来的吗
你可以在退出登录吧菜单设置为空

嗯,早前也遇到了这个问题,所以每次登陆操作完成之后直接重置了缓存的路由菜单.....

MaJiFu
  • 2
新手上路,请多包涵

今天遇到这个问题,刚好解决了,分享一下。
首先按照这个路径找到tabs组件的loadCachedTabs()方法:
2ad4aeb4c4cc2eb4a68c79915e92ca3.png
16e999826125927f5e512a9db90088f.png
如果希望切换用户之后不出现任何之前打开过的tabs,那就把整个方法注释掉就ok了。但如果你想切换用户之后自动打开某一个页面,那就可以像我这么做this.$router.push('/xxxx')

你知道吗?

宣传栏