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中的自定义指令
Dec 07 Vue.js
如何在vue中使用kindeditor富文本编辑器
Dec 19 Vue.js
Vue——解决报错 Computed property "****" was assigned to but it has no setter.
Dec 19 Vue.js
vue实现登录、注册、退出、跳转等功能
Dec 23 Vue.js
Vuex实现简单购物车
Jan 10 Vue.js
Vue仿Bibibili首页的问题
Jan 21 Vue.js
vue-cli 3如何使用vue-bootstrap-datetimepicker日期插件
Feb 20 Vue.js
vue首次渲染全过程
Apr 21 Vue.js
vue使用wavesurfer.js解决音频可视化播放问题
Apr 04 Vue.js
vue中的可拖拽宽度div的实现示例
Apr 08 Vue.js
使用vue判断当前环境是安卓还是IOS
Apr 12 Vue.js
Vue router配置与使用分析讲解
Dec 24 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实现框架(二)
2006/10/09 PHP
用文本文件实现的动态实时发布新闻的程序
2006/10/09 PHP
用PHP读取flv文件的播放时间长度
2009/09/03 PHP
php画图实例
2014/11/05 PHP
详解php的socket通信
2015/08/11 PHP
Yii视图CGridView列表用法实例分析
2016/07/12 PHP
PHP + plupload.js实现多图上传并显示进度条加删除实例代码
2017/03/06 PHP
jMessageBox 基于jQuery的窗口插件
2009/12/09 Javascript
javascript游戏开发之《三国志曹操传》零部件开发(二)人物行走的实现
2013/01/23 Javascript
JavaScript实现彩虹文字效果的方法
2015/04/16 Javascript
JS建造者模式基本用法实例分析
2015/06/30 Javascript
js表单处理中单选、多选、选择框值的获取及表单的序列化
2016/03/08 Javascript
Bootstrap~多级导航(级联导航)的实现效果【附代码】
2016/03/08 Javascript
基于JS实现移动端访问PC端页面时跳转到对应的移动端网页
2020/12/24 Javascript
动态加载js文件简单示例
2016/04/21 Javascript
JS动态给对象添加属性和值的实现方法
2016/10/21 Javascript
jQuery插件HighCharts绘制2D带有Legend的饼图效果示例【附demo源码下载】
2017/03/10 Javascript
angular.fromJson与toJson方法用法示例
2017/05/17 Javascript
详解微信第三方小程序代开发
2017/06/23 Javascript
NodeJS多种创建WebSocket监听的方式(三种)
2020/06/04 NodeJs
typescript配置alias的详细步骤
2020/08/12 Javascript
Vue实现图书管理小案例
2020/12/03 Vue.js
[01:02:10]DOTA2上海特级锦标赛B组小组赛#2 VG VS Fnatic第一局
2016/02/26 DOTA
LRUCache的实现原理及利用python实现的方法
2017/11/21 Python
python 下 CMake 安装配置 OPENCV 4.1.1的方法
2019/09/30 Python
python垃圾回收机制(GC)原理解析
2019/12/30 Python
PyQt5 界面显示无响应的实现
2020/03/26 Python
Django模板标签{% for %}循环,获取制定条数据实例
2020/05/14 Python
CSS3 Flexbox中flex-shrink属性的用法示例介绍
2013/12/30 HTML / CSS
H5 meta小结(前端必看篇)
2016/08/24 HTML / CSS
党员自我评价分享
2013/12/13 职场文书
面试自我介绍演讲稿
2014/04/29 职场文书
英文导游词
2015/02/13 职场文书
党校个人总结
2015/03/04 职场文书
幼儿园推普周活动总结
2015/05/07 职场文书
关于企业的执行力标语大全
2020/01/06 职场文书