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

 更新时间:2021年02月26日 10:28:13   作者:暖风吹过的季节  
这篇文章主要介绍了vue动态添加的路由页面刷新时失效的原因及解决方案,帮助大家更好的理解和学习使用vue,感兴趣的朋友可以了解下

问题描述

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

场景

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

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

接口返回

前端菜单定义

vuex中的方法

出现的问题

登录后,通过调用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 路由页面刷新的资料请关注脚本之家其它相关文章!

相关文章

  • vue实现在进行增删改操作后刷新页面

    vue实现在进行增删改操作后刷新页面

    这篇文章主要介绍了vue实现在进行增删改操作后刷新页面,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • vue如何通过插槽组件之间数据传递

    vue如何通过插槽组件之间数据传递

    这篇文章主要介绍了vue如何通过插槽组件之间数据传递问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06
  • Vue使用自定义指令实现拖拽行为实例分析

    Vue使用自定义指令实现拖拽行为实例分析

    这篇文章主要介绍了Vue使用自定义指令实现拖拽行为,结合实例形式分析了Vue使用自定义指令实现拖拽行为具体步骤、原理与操作注意事项,需要的朋友可以参考下
    2020-06-06
  • vue3+ts+element-plus实际开发之统一调用弹窗封装的详细过程

    vue3+ts+element-plus实际开发之统一调用弹窗封装的详细过程

    这篇文章主要介绍了vue3+ts+element-plus实际开发之统一调用弹窗封装的详细过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2024-03-03
  • 一文详解VueUse中useAsyncState的实现原理

    一文详解VueUse中useAsyncState的实现原理

    在Vue 3 Composition API中,我们可以使用自定义钩子函数来封装可复用的逻辑,useAsyncState是一个用于管理异步状态的自定义钩子函数,本文将给大家介绍一下useAsyncState的实现原理,感兴趣的朋友可以参考下
    2024-01-01
  • vue引入swiper插件的使用实例

    vue引入swiper插件的使用实例

    本篇文章主要介绍了vue引入swiper插件的使用实例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07
  • vue 中使用print.js导出pdf操作

    vue 中使用print.js导出pdf操作

    这篇文章主要介绍了vue 中使用print.js导出pdf操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11
  • vue3 teleport的使用案例详解

    vue3 teleport的使用案例详解

    这篇文章主要介绍了vue3 teleport的使用demo,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-11-11
  • vue-router动态路由实现前端权限管理方式

    vue-router动态路由实现前端权限管理方式

    这篇文章主要介绍了vue-router动态路由实现前端权限管理方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-10-10
  • Vue如何实现组件间通信

    Vue如何实现组件间通信

    组件间通信简单来说就是组件间进行数据传递。就像我们日常的打电话,就是通讯的一种方式,你把话说给我听,我把话说给你听,说的话就是数据。电话就是通讯方式的一种。无论是 Vue 还是 React ,都得进行组件间通信。
    2021-05-05

最新评论