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

BigPolo
  • 74

使用 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这个值来判断是否是被服务端控制的。

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

回复
阅读 289
3 个回答

这样的问题有两种解决办法:
方案一: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 是接口查询出来的吗
你可以在退出登录吧菜单设置为空

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
你知道吗?

宣传栏