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 相关文章推荐
vue+iview分页组件的封装
Nov 17 Vue.js
vue-router定义元信息meta操作
Dec 07 Vue.js
vue使用exif获取图片旋转,压缩的示例代码
Dec 11 Vue.js
vue 基于abstract 路由模式 实现页面内嵌的示例代码
Dec 14 Vue.js
Vue在H5 项目中使用融云进行实时个人单聊通讯
Dec 14 Vue.js
Vue使用鼠标在Canvas上绘制矩形
Dec 24 Vue.js
vue 实现图片懒加载功能
Dec 31 Vue.js
Vue实现图书管理案例
Jan 20 Vue.js
vue使用节流函数的踩坑实例指南
May 20 Vue.js
vue+springboot实现登录验证码
May 27 Vue.js
vue基于Teleport实现Modal组件
May 31 Vue.js
vue项目打包后路由错误的解决方法
Apr 13 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下编码转换函数mb_convert_encoding与iconv的使用说明
2009/12/16 PHP
PHP中JSON的应用技巧
2015/10/10 PHP
使用JavaScript修改浏览器URL地址栏的实现代码
2013/10/21 Javascript
jquery如何实现锚点链接之间的平滑滚动
2013/12/02 Javascript
js验证输入是否为手机号码或电话号码示例
2013/12/30 Javascript
中文输入法不触发onkeyup事件的解决办法
2014/07/09 Javascript
JavaScript人脸识别技术及脸部识别JavaScript类库Tracking.js
2015/09/14 Javascript
Document.body.scrollTop的值总为零的快速解决办法
2016/06/09 Javascript
后端接收不到AngularJs中$http.post发送的数据原因分析及解决办法
2016/07/05 Javascript
微信小程序 Audio API详解及实例代码
2016/09/30 Javascript
基于ajax与msmq技术的消息推送功能实现代码
2016/12/26 Javascript
jQuery事件详解
2017/02/23 Javascript
微信小程序 配置顶部导航条标题颜色的实现方法
2017/09/20 Javascript
关于jquery中attr()和prop()方法的区别
2018/05/28 jQuery
BootStrap table实现表格行拖拽效果
2018/12/01 Javascript
如何在JavaScript中创建具有多个空格的字符串?
2020/02/23 Javascript
web.py获取上传文件名的正确方法
2014/08/26 Python
Python中返回字典键的值的values()方法使用
2015/05/22 Python
windows下python连接oracle数据库
2017/06/07 Python
Python探索之pLSA实现代码
2017/10/25 Python
基于Python List的赋值方法
2018/06/23 Python
python实现大转盘抽奖效果
2019/01/22 Python
Python实现的远程文件自动打包并下载功能示例
2019/07/12 Python
Python中openpyxl实现vlookup函数的实例
2020/10/28 Python
用Python制作音乐海报
2021/01/26 Python
HTML5中图片之间的缝隙完美解决方法
2017/07/07 HTML / CSS
Boda Skins皮衣官网:奢侈皮夹克,全球配送
2016/12/15 全球购物
求职推荐信
2013/10/28 职场文书
商务主管岗位职责
2013/12/08 职场文书
《长城和运河》教学反思
2014/04/14 职场文书
汉语专业毕业生自荐信
2014/07/06 职场文书
黄山导游词
2015/01/31 职场文书
清明节寄语2015
2015/03/23 职场文书
钢琴师观后感
2015/06/12 职场文书
消费者理赔投诉书
2015/07/02 职场文书
关于Vue中的options选项
2022/03/22 Vue.js