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 29 Vue.js
Vue实现图书管理案例
Jan 20 Vue.js
使用vue3重构拼图游戏的实现示例
Jan 25 Vue.js
vue+echarts实现中国地图流动效果(步骤详解)
Jan 27 Vue.js
vue实现拖拽进度条
Mar 01 Vue.js
vue3.0中使用element的完整步骤
Mar 04 Vue.js
浅谈Vue的computed计算属性
Mar 21 Vue.js
VUE使用draggable实现组件拖拽
Apr 06 Vue.js
vue3使用vuedraggable实现拖拽功能
Apr 06 Vue.js
vue实现可以快进后退的跑马灯组件
Apr 08 Vue.js
vue实现列表拖拽排序的示例代码
Apr 08 Vue.js
Vue OpenLayer测距功能的实现
Apr 20 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
source.php查看源文件
2006/12/09 PHP
一个很不错的PHP翻页类
2009/06/01 PHP
PHP判断图片格式的七种方法小结
2013/06/03 PHP
PHP htmlspecialchars() 函数实例代码及用法大全
2018/09/18 PHP
在chrome浏览器中,防止input[text]和textarea在聚焦时出现黄色边框的解决方法
2011/05/24 Javascript
EditPlus注册码生成器(js代码实现)
2013/03/25 Javascript
jQuery产品间断向下滚动效果核心代码
2014/05/08 Javascript
javascript 10进制和62进制的相互转换
2014/07/31 Javascript
EasyUi datagrid 实现表格分页
2015/02/10 Javascript
JavaScript通过setTimeout实时显示当前时间的方法
2015/04/16 Javascript
浅谈javascript中return语句
2015/07/15 Javascript
深入解析jQuery中Deferred的deferred.promise()方法
2016/05/03 Javascript
angularjs中ng-bind-html的用法总结
2017/05/23 Javascript
Vue-resource拦截器判断token失效跳转的实例
2017/10/27 Javascript
layui导出所有数据的例子
2019/09/10 Javascript
Vue实现点击按钮复制文本内容的例子
2019/11/09 Javascript
浅谈Node新版本13.2.0正式支持ES Modules特性
2019/11/25 Javascript
Vue全局使用less样式,组件使用全局样式文件中定义的变量操作
2020/10/21 Javascript
[48:02]Ti4循环赛第三日 VG vs Liquid和NEWBEE vs DK
2014/07/12 DOTA
python判断给定的字符串是否是有效日期的方法
2015/05/13 Python
python3使用urllib模块制作网络爬虫
2016/04/08 Python
老生常谈Python startswith()函数与endswith函数
2017/09/08 Python
Python获取昨天、今天、明天开始、结束时间戳的方法
2018/06/01 Python
解读python如何实现决策树算法
2018/10/11 Python
零基础学python应该从哪里入手
2020/08/11 Python
CSS3不透明度实例讲解
2016/04/26 HTML / CSS
HTML5实时语音通话聊天MP3压缩传输3KB每秒
2019/08/28 HTML / CSS
英国知名美妆护肤在线商城:Zest Beauty
2018/04/24 全球购物
澳大利亚当地最大的时装生产商:Cue
2018/08/06 全球购物
ASOS西班牙官网:英国在线时尚和美容零售商
2020/01/10 全球购物
酷瑞网络科技面试题
2012/03/30 面试题
养牛场项目建议书
2014/05/13 职场文书
经济管理自荐书
2014/06/09 职场文书
2014年库房工作总结
2014/11/26 职场文书
开除通知书范本
2015/04/25 职场文书
大学体育课感想
2015/08/10 职场文书