vue动态添加路由后刷新页面白屏问题

627 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 2 天,点击查看活动详情

前言

项目中遇到权限处理时,通常会采用动态添加路由的方法来实现,此方法会在登陆时利用vuex将用户信息以及菜单栏需要展示的菜单路由保存,这样在用户第一次登陆项目时,动态渲染的菜单路由页面一切正常,但是当再次刷新的时候,就会出现白屏现象

解决

解决思路:页面刷新白屏其实是因为vuex引起的,由于刷新页面vuex数据会丢失,所以动态添加路由这一步也就失效了(之前以为,将动态添加的路由存储在了sessionStorage中,就不会vuex刷新数据丢失的影响,在通过vuex中的state属性存储路由在sessionStorage中,只是存储了左侧菜单栏展示的信息path地址,但是并没有存进去路由详细信息,比如name,meta值,利用vue插件即可看到本地route里面的真实数据!所以;只需要添加路由守卫,在每次页面刷新的时候都来判断是否添加的动态路由【这里设置一个变量记录是否添加的布尔值】,如果为false,即再次执行一遍添加动态路由的过程即可

const hasGetUserInfo = store.getters.name

      if (hasGetUserInfo) {
        
        next()
      } else {
        try {
          // 如果没有获取到vuex中到name
          await store.dispatch('user/getInfo') //触发获取用户信息的接口
          await store.dispatch('user/getRouter') //触发获取路由表的接口   
          if (store.getters.menus.length < 1) {
            store.getters.menus = []
            next()
          }
          const menus = filterAsyncRouter(store.getters.menus) //过滤异步路由
          router.addRoutes(menus) //动态添加路由
          await store.dispatch('user/keepMenu', menus) //将过滤后的异步路由传递给vuex中的menus,做侧边栏渲染的工作

          next({
            ...to,
            replace: true
          })
          //注意next的改变
        } catch (error) {
          await store.dispatch('user/resetToken') //触发vuex中  resetToken
          Message.error(error || 'Has Error') //弹出异常
          next(`/login?redirect=${to.path}`) //然后就执行这里 跳转到 login  redirect把从哪个页面出错的 
          NProgress.done()
        }
      }