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 element实现表格合并行数据
Nov 30 Vue.js
vue组件中节流函数的失效的原因和解决方法
Dec 02 Vue.js
Vue组件简易模拟实现购物车
Dec 21 Vue.js
在vue项目中封装echarts的步骤
Dec 25 Vue.js
vue+vant 上传图片需要注意的地方
Jan 03 Vue.js
解决vue使用vant轮播组件swipe + flex时文字抖动问题
Jan 07 Vue.js
Vue中ref和$refs的介绍以及使用方法示例
Jan 11 Vue.js
Vue中避免滥用this去读取data中数据
Mar 02 Vue.js
使用Vue.js和MJML创建响应式电子邮件
Mar 23 Vue.js
vue实现锚点定位功能
Jun 29 Vue.js
vue判断按钮是否可以点击
Apr 09 Vue.js
vue自定义右键菜单之全局实现
Apr 09 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判断当前用户已在别处登录的方法
2015/01/06 PHP
PHP实现动态柱状图改进版
2015/03/30 PHP
php读取出一个文件夹及其子文件夹下所有文件的方法示例
2017/06/15 PHP
PHP验证类的封装与使用方法详解
2019/01/10 PHP
ECMAScript 基础知识
2007/06/29 Javascript
JS Date函数整理方便使用
2013/10/23 Javascript
javascript弹出层输入框(示例代码)
2013/12/11 Javascript
Nodejs学习笔记之测试驱动
2015/04/16 NodeJs
jQuery操作属性和样式详解
2016/04/13 Javascript
检查表单元素的值是否为空的实例代码
2016/06/16 Javascript
Google 地图获取API Key详细教程
2016/08/06 Javascript
Vue.js 2.0窥探之Virtual DOM到底是什么?
2017/02/10 Javascript
详解angular中的作用域及继承
2017/05/31 Javascript
dropload.js插件下拉刷新和上拉加载使用详解
2017/10/20 Javascript
实例解析ES6 Proxy使用场景介绍
2018/01/08 Javascript
Hexo已经看腻了,来手把手教你使用VuePress搭建个人博客
2018/04/26 Javascript
微信小程序自定义tab实现多层tab嵌套功能
2018/06/15 Javascript
element-ui中select组件绑定值改变,触发change事件方法
2018/08/24 Javascript
JS字符串与二进制的相互转化实例代码详解
2019/06/28 Javascript
layer扩展打开/关闭动画的方法
2019/09/23 Javascript
关于layui 实现点击按钮添加一行(方法渲染创建的table)
2019/09/29 Javascript
原生JS实现拖拽效果
2020/12/04 Javascript
python http接口自动化脚本详解
2018/01/02 Python
python pandas 组内排序、单组排序、标号的实例
2018/04/12 Python
面向初学者的Python编辑器Mu
2018/10/08 Python
Python 文件操作之读取文件(read),文件指针与写入文件(write),文件打开方式示例
2019/09/29 Python
python如何修改文件时间属性
2021/02/05 Python
详解css3自定义滚动条样式写法
2017/12/25 HTML / CSS
50个强大璀璨的CSS3/JS技术运用实例
2010/02/27 HTML / CSS
雪花秀美国官方网站:韩国著名草本护肤化妆品品牌
2016/10/19 全球购物
世界领先的高品质定制产品平台:Zazzle
2017/07/23 全球购物
美国在线纱线商店:Darn Good Yarn
2019/03/20 全球购物
高中升旗仪式演讲稿
2014/09/09 职场文书
好段摘抄大全(48句)
2019/08/08 职场文书
Elasticsearch 配置详解
2022/04/19 Java/Android
利用Java连接Hadoop进行编程
2022/06/28 Java/Android