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


Posted in Vue.js onFebruary 26, 2021

问题描述

昨天在做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 路由页面刷新的资料请关注三水点靠木其它相关文章!

Vue.js 相关文章推荐
vue3.0中友好使用antdv示例详解
Jan 05 Vue.js
Vue如何实现变量表达式选择器
Feb 18 Vue.js
Vue2.x-使用防抖以及节流的示例
Mar 02 Vue.js
详解vue3中组件的非兼容变更
Mar 03 Vue.js
vue-cli4.5.x快速搭建项目
May 30 Vue.js
vue基于Teleport实现Modal组件
May 31 Vue.js
vite+vue3.0+ts+element-plus快速搭建项目的实现
Jun 24 Vue.js
Vue实现跑马灯样式文字横向滚动
Nov 23 Vue.js
浅谈Vue的computed计算属性
Mar 21 Vue.js
在vue中import()语法不能传入变量的问题及解决
Apr 01 Vue.js
vue 把二维或多维数组转一维数组
Apr 24 Vue.js
VUE解决跨域问题Access to XMLHttpRequest at
May 06 Vue.js
vue项目配置 webpack-obfuscator 进行代码加密混淆的实现
Feb 26 #Vue.js
vue中h5端打开app(判断是安卓还是苹果)
Feb 26 #Vue.js
Vue基本指令实例图文讲解
Feb 25 #Vue.js
vue常用高阶函数及综合实例
Feb 25 #Vue.js
详解vite+ts快速搭建vue3项目以及介绍相关特性
Feb 25 #Vue.js
基于vue-simple-uploader封装文件分片上传、秒传及断点续传的全局上传插件功能
Feb 23 #Vue.js
用vite搭建vue3应用的实现方法
Feb 22 #Vue.js
You might like
PHP开发框架总结收藏
2008/04/24 PHP
用php过滤危险html代码的函数
2008/07/22 PHP
总结PHP中数值计算的注意事项
2016/08/14 PHP
使用PHPUnit进行单元测试并生成代码覆盖率报告的方法
2019/03/08 PHP
Extjs中使用extend(js继承) 的代码
2012/03/15 Javascript
jquery select多选框的左右移动 具体实现代码
2013/07/03 Javascript
js调试工具Console命令详解
2014/10/21 Javascript
node.js中的events.EventEmitter.listenerCount方法使用说明
2014/12/08 Javascript
JavaScript代码里的判断小结
2016/08/22 Javascript
Bootstrap CSS组件之分页(pagination)和翻页(pager)
2016/12/17 Javascript
JavaScript瀑布流布局实现代码
2017/05/06 Javascript
详解React中传入组件的props改变时更新组件的几种实现方法
2018/09/13 Javascript
nodejs实现范围请求的实现代码
2018/10/12 NodeJs
Jquery遍历筛选数组的几种方法和遍历解析json对象,Map()方法详解以及数组中查询某值是否存在
2019/01/18 jQuery
深入解析Vue源码实例挂载与编译流程实现思路详解
2019/05/05 Javascript
前端js中的事件循环eventloop机制详解
2019/05/15 Javascript
React Native登录之指纹登录篇的示例代码
2020/11/03 Javascript
解决vue-cli输入命令vue ui没效果的问题
2020/11/17 Javascript
Python单元测试框架unittest简明使用实例
2015/04/13 Python
浅谈Python的文件类型
2016/05/30 Python
Python升级导致yum、pip报错的解决方法
2017/09/06 Python
Python制作词云的方法
2018/01/03 Python
简单实现python数独游戏
2018/03/30 Python
python获取本机所有IP地址的方法
2018/12/26 Python
python实现nao机器人身体躯干和腿部动作操作
2019/04/29 Python
详解有关PyCharm安装库失败的问题的解决方法
2020/02/02 Python
记一次django内存异常排查及解决方法
2020/08/07 Python
CSS3属性选择符介绍
2008/10/17 HTML / CSS
荷兰多品牌网上鞋店:Stoute Schoenen
2017/08/24 全球购物
Stefania Mode美国:奢华设计师和时尚服装
2018/01/07 全球购物
德国机场停车位比较和预订网站:Ich-parke-billiger
2018/01/08 全球购物
一套C#面试题
2013/10/09 面试题
应用艺术毕业生的自我评价
2013/12/04 职场文书
村道德模范事迹材料
2014/08/28 职场文书
酒店服务员岗位职责
2015/02/09 职场文书
行政答辩状范文
2015/05/21 职场文书