当前位置:   article > 正文

vue3 如果切换角色后权限不同 怎么清空之前添加动态路由。_vue3清空addroute添加的路由

vue3清空addroute添加的路由

项目中切换角色后发现会保留前面一个角色的权限,方法一是到login页面,权限重新reload,不过这样确实会影响体验,如果不采用此方案的话,你可以看下我从发现问题到解决问题的思路:

1、首先要找到一个初始状态值,所以我打开login页面,查看当前用到的路由(作为一个初始状态值),如下图

其实可以看到,这4个路由是基本的路由,其他都是我们动态添加路由,那我们需要做的其实就是在退出登录的时候,将所有的路由恢复到这个初始化状态;

2、有了第一条的思路后,就可以第二步就是应该去查阅vue-router4.0的官方文档,于是找到了下图

然后尝试了了用removeRoute()的方法来移出路由,发现会将所有home以及home的所有子路由都删除掉,而我们想要达到的效果是,删除除了home还有home名叫wecolme的子路由以外的所有路由,所以这个removeRoute API并不适合(当然你可以先删除再新增路由,只是显得代码有点臃肿),继续寻找方法;

3、有了以上的思路,我们继续看文档,发现了接下来文档的描述

这便是我的解决思路,可以添加一个同名的路由,这样可以直接覆盖掉之前同名的路由,看到这里,其实就很简单了,只需要添加一个home,和welcome路由即可,所以我们需要做的就是,在单击退出的时候,添加一步操作,如下图:

4、测试,效果,当用admin账号登录后,点击退出,在不刷新页面的情况下,登录普通的账号(比如这个账号没有角色管理权限),那么在登录成功之后,如果从url上边直接输入/system/role的话,会直接被拦截,进入熟悉的404页面。

以下是代码router里面的代码

  1. import { createRouter, createWebHashHistory, RouteRecordRaw } from 'vue-router'
  2. import Api from './../api'
  3. import utils from './../utils/utils'
  4. const routes: RouteRecordRaw[] = [
  5. {
  6. name: 'HomeAd',
  7. path: '/',
  8. redirect: '/welcome',
  9. component: () => import('../views/HomeAd.vue'),
  10. children: [
  11. {
  12. name: 'WelcomeAd',
  13. path: '/welcome',
  14. meta: { title: '欢迎页' },
  15. component: () => import('../views/WelcomeAd.vue')
  16. },
  17. //此处是动态路由
  18. ]
  19. },
  20. {
  21. name: 'LoginAd',
  22. path: '/login',
  23. meta: {
  24. title: '登录页'
  25. },
  26. component: () => import('../views/LoginAd.vue')
  27. },
  28. {
  29. name: '404Ad',
  30. path: '/404',
  31. meta: {
  32. title: '页面不存在'
  33. },
  34. component: () => import('../views/404Ad.vue')
  35. }
  36. ]
  37. const router = createRouter({
  38. routes,
  39. history: createWebHashHistory()
  40. })
  41. console.log(router.getRoutes());
  42. //重置路由
  43. export function resetRouter(){
  44. let routers = router.getRoutes()
  45. console.log(routers);
  46. routers.map((it:any)=>{
  47. if(!['LoginAd','404Ad'].includes(it.name)){
  48. router.removeRoute(it.name)
  49. }
  50. })
  51. console.log(routers);
  52. }
  53. //权限菜单
  54. export async function loadAsyncRoutes() {
  55. let userInfo = JSON.parse(window.sessionStorage.getItem('userinfo') || '{}')
  56. if (userInfo.token) {
  57. try {
  58. const res: any = await Api.getPermissionMenuList()
  59. const { menuList } = res
  60. let routes = utils.generatorRoutes(menuList)
  61. let modules = import.meta.glob('../views/*vue')
  62. console.log(modules);
  63. routes.map((route: any) => {
  64. let url = `../views/${route.name}.vue`
  65. route.component = modules[url]
  66. router.addRoute('HomeAd', route)
  67. })
  68. } catch (error) {
  69. console.log(error);
  70. }
  71. }
  72. }
  73. //导航守卫
  74. router.beforeEach(async (to, from, next) => {
  75. let data: string = window.sessionStorage.getItem('userinfo') || '{}'
  76. let { token = "" } = JSON.parse(data)
  77. if (to.name) {
  78. if (router.hasRoute(to.name)) {
  79. document.title = to.meta.title as any
  80. if (!token && to.name != 'LoginAd') {
  81. next({ name: 'LoginAd', replace: true })
  82. }
  83. next()
  84. } else {
  85. next('/404')
  86. }
  87. } else {
  88. await loadAsyncRoutes()
  89. let curRoute = router.getRoutes().filter(v => v.path == to.path)
  90. if (curRoute?.length) {
  91. document.title = curRoute[0].meta.title as string
  92. next({ ...to, replace: true })
  93. } else {
  94. next('/404')
  95. }
  96. }
  97. })
  98. export default router

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号