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 + el-form 实现的多层循环表单验证
Nov 25 Vue.js
在Vue中使用CSS3实现内容无缝滚动的示例代码
Nov 27 Vue.js
vue3使用vue-count-to组件的实现
Dec 25 Vue.js
vue+vant 上传图片需要注意的地方
Jan 03 Vue.js
vue项目如何监听localStorage或sessionStorage的变化
Jan 04 Vue.js
vue常用高阶函数及综合实例
Feb 25 Vue.js
vue3.0中使用element的完整步骤
Mar 04 Vue.js
vue实现简单数据双向绑定
Apr 28 Vue.js
vue.js Router中嵌套路由的实用示例
Jun 27 Vue.js
Vue中Object.assign清空数据报错的解决方案
Mar 03 Vue.js
vue中div禁止点击事件的实现
Apr 02 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
AM/FM收音机的安装与调试
2021/03/02 无线电
php字符比较函数similar_text、strnatcmp与strcasecmp用法分析
2014/11/18 PHP
EXTJS记事本 当CompositeField遇上RowEditor
2011/07/31 Javascript
javascript跟随滚动效果插件代码(javascript Follow Plugin)
2013/08/03 Javascript
JS获取几种URL地址的方法小结
2014/02/26 Javascript
使用js检测浏览器是否支持html5中的video标签的方法
2014/03/12 Javascript
Ext GridPanel加载完数据后进行操作示例代码
2014/06/17 Javascript
jquery bind(click)传参让列表中每行绑定一个事件
2014/08/06 Javascript
JavaScript中跨域调用Flash的方法
2014/08/11 Javascript
修复bash漏洞的shell脚本分享
2014/12/31 Javascript
JavaScript 表单处理实现代码
2015/04/13 Javascript
vue2.0项目中使用Ueditor富文本编辑器示例代码
2017/08/14 Javascript
原生JS实现逼真的图片3D旋转效果详解
2019/02/16 Javascript
[02:28]DOTA2英雄基础教程 狼人
2013/12/23 DOTA
python爬虫入门教程之糗百图片爬虫代码分享
2014/09/02 Python
对dataframe进行列相加,行相加的实例
2018/06/08 Python
浅析python参数的知识点
2018/12/10 Python
python web自制框架之接受url传递过来的参数实例
2018/12/17 Python
Python定义函数功能与用法实例详解
2019/04/08 Python
python3.7将代码打包成exe程序并添加图标的方法
2019/10/11 Python
pytorch 实现tensor与numpy数组转换
2019/12/27 Python
Python 面向对象静态方法、类方法、属性方法知识点小结
2020/03/09 Python
mac 上配置Pycharm连接远程服务器并实现使用远程服务器Python解释器的方法
2020/03/19 Python
Nordgreen台湾官网:极简北欧设计手表
2019/08/21 全球购物
为什么使用接口?
2014/08/13 面试题
动物科学专业毕业生的自我评价
2013/11/29 职场文书
保密承诺书范文
2014/03/27 职场文书
大学生作弊检讨书
2014/09/11 职场文书
2014年企业员工工作总结
2014/12/09 职场文书
2014办公室年度工作总结
2014/12/09 职场文书
楚门的世界观后感
2015/06/03 职场文书
秋菊打官司观后感
2015/06/03 职场文书
Go Plugins插件的实现方式
2021/08/07 Golang
Go 通过结构struct实现接口interface的问题
2021/10/05 Golang
HTML常用标签超详细整理
2022/03/19 HTML / CSS
windows server 2012安装FTP并配置被动模式指定开放端口
2022/06/10 Servers