vue 动态添加的路由页面刷新时失效的原因及解决方案

2022-04-15 0 1,088
目录
  • 问题描述
  • 场景
    • 接口返回
    • 前端菜单定义
    • vuex中的方法
  • 出现的问题
    • 原因分析
      • 解决方案
        • 实现代码 route/index.js的导航守卫中添加逻辑判断
      • 总结

        问题描述

        昨天在做vue后台管理系统有关权限页面动态添加到路由的功能时,遇到一个问题:动态添加的路由页面,在页面刷新时出现了404的情况。

        场景

        后台管理系统的权限控制是通过在前端页面定义权限code, 把code给后台同学保存配置到表中,之后根据后台返回的权限code列表与前端页面配置的code菜单列表做筛选匹配,code相等的页面就是有权限的页面,再通过router.addRoute()动态添加到路由中,有权限的路由才可以被访问,否则会提示无权限。

        固定路由一开始就会放在new Router中,比如登录页面login

        接口返回

        vue 动态添加的路由页面刷新时失效的原因及解决方案

        前端菜单定义

        vue 动态添加的路由页面刷新时失效的原因及解决方案

        vuex中的方法

        vue 动态添加的路由页面刷新时失效的原因及解决方案

        vue 动态添加的路由页面刷新时失效的原因及解决方案

        出现的问题

        登录后,通过调用vuex中的方法,完成获取权限code,动态筛选权限路由页面操作,然后通过router.addRoute()将有权限菜单添加到路由中,进入动态添加的路由页面,刷新页面出现404

        原因分析

        页面刷新时,路由重新初始化,动态添加的路由此时已不存在,只有一些固定路由(比如登录页面)还在,所以出现了404的情况

        解决方案

        VUEX store中存储的数据会在页面刷新时清空。
        在路由的全局导航router.beforeEach处做个判断,根据VUEX中存放的list是否有值来判断页面是否是刷新,如果不为0,则是第一次登陆,登录后会走匹配路由的方法,不会有问题;如果list.length为0,就为刷新页面,需要重新执行路由匹配,重新添加动态路由即可。

        实现代码 route/index.js的导航守卫中添加逻辑判断

        ———router.js————-

        const constantRoutes = [
         {
          path: '/',
          redirect: '/login'
         },
         {
          path: '/login',
          name: 'login',
          meta: {
           auth: false
          },
          component: () => import('@/views/login')
         },
         {
          path: '/layout',
          name: 'layout',
          meta: {
           auth: true
          },
          component: () => import('@/views/layout/index'),
          children: [
           {
            path: '/index',
            name: 'index',
            component: () => import('@/views/home')
           }
          ]
         },
         {
          path: '*',
          component: () => import('@/views/error/404')
         }
        ]
        
        Vue.use(VueRouter)
        const createRouter = () =>
         new VueRouter({
          routes: constantRoutes
         })
        export function resetRouter() {
         const newRouter = createRouter()
         router.matcher = newRouter.matcher // reset router
        }
        const router = createRouter()
         
        //页面刷新后重新设置权限页面动态路由,防止出现动态路由404问题
        const reSetPermissionList = to => {
         return new Promise((resolve, reject) => {
          if (to.path !== '/login' && store.state.permission.permissionList.length === 0) {
           store
            .dispatch('permission/getPermissionList')
            .then(() => {
             resolve('permCode')
            })
            .catch(error => {
             resolve('permCode')
            })
          } else {
           resolve()
          }
         })
        }
        router.beforeEach((to, from, next) => {
          
         const accessToken = localStorage.getItem('accessToken')
         if (_.isEmpty(accessToken)) {//是否已经登录 否 去登陆页面
          next({
           path: '/login',
           query: {
            redirect: to.fullPath
           }
          })
         } else { //已登录用户进入页面
          if (to.path === '/login') {
           next({ path: '/index' })
          } else {
            reSetPermissionList(to).then(data => {
             data === 'permCode' ? next({ path: to.path, query: to.query }) : next()
            })
          }
         }
         
        })
        

        总结

        主要通过在全局导航处判断VUEX中的数据是否存在,判断页面是否刷新,是的话重新走一遍权限路由匹配的方法。

        以上就是vue动态添加的路由页面刷新时失效的原因及解决方案的详细内容,更多关于vue 路由页面刷新的资料请关注NICE源码其它相关文章!

        免责声明:
        1、本网站所有发布的源码、软件和资料均为收集各大资源网站整理而来;仅限用于学习和研究目的,您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。 不得使用于非法商业用途,不得违反国家法律。否则后果自负!

        2、本站信息来自网络,版权争议与本站无关。一切关于该资源商业行为与www.niceym.com无关。
        如果您喜欢该程序,请支持正版源码、软件,购买注册,得到更好的正版服务。
        如有侵犯你版权的,请邮件与我们联系处理(邮箱:skknet@qq.com),本站将立即改正。

        NICE源码网 JavaScript vue 动态添加的路由页面刷新时失效的原因及解决方案 https://www.niceym.com/31778.html