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的mixin策略
Nov 19 Vue.js
vue自定义插件封装,实现简易的elementUi的Message和MessageBox的示例
Nov 20 Vue.js
Vue Elenent实现表格相同数据列合并
Nov 30 Vue.js
vue3使用vue-count-to组件的实现
Dec 25 Vue.js
Vue 实例中使用$refs的注意事项
Jan 29 Vue.js
vue项目配置 webpack-obfuscator 进行代码加密混淆的实现
Feb 26 Vue.js
原生JS封装vue Tab切换效果
Apr 28 Vue.js
vite+vue3.0+ts+element-plus快速搭建项目的实现
Jun 24 Vue.js
详解Vue slot插槽
Nov 20 Vue.js
vue3.0 数字翻牌组件的使用方法详解
Apr 20 Vue.js
vue3不同环境下实现配置代理
May 25 Vue.js
Vue3实现简易音乐播放器组件
Aug 14 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
phpcms模块开发之swfupload的使用介绍
2013/04/28 PHP
php中0,null,empty,空,false,字符串关系的详细介绍
2013/06/20 PHP
PHP SPL标准库之文件操作(SplFileInfo和SplFileObject)实例
2015/05/11 PHP
开发 Internet Explorer 右键功能表(ContextMenu)
2013/07/03 Javascript
js用闭包遍历树状数组的方法
2014/03/19 Javascript
jQuery中ajax的post()方法用法实例
2014/12/26 Javascript
js获取json元素数量的方法
2015/01/27 Javascript
javascript常用函数(1)
2015/11/04 Javascript
利用JavaScript实现栈的数据结构示例代码
2017/08/02 Javascript
如何用input标签和jquery实现多图片的上传和回显功能
2018/05/16 jQuery
jQuery实现的滑块滑动导航效果示例
2018/06/04 jQuery
vue中$nextTick的用法讲解
2019/01/17 Javascript
JS XMLHttpRequest原理与使用方法深入详解
2020/04/30 Javascript
Vue中的nextTick作用和几个简单的使用场景
2021/01/25 Vue.js
简单的Python抓taobao图片爬虫
2014/10/26 Python
详解C++编程中一元运算符的重载
2016/01/19 Python
深入理解Python中range和xrange的区别
2017/11/26 Python
python编程线性回归代码示例
2017/12/07 Python
Pycharm设置界面全黑的方法
2018/05/23 Python
Django框架模板注入操作示例【变量传递到模板】
2018/12/19 Python
python“静态”变量、实例变量与本地变量的声明示例
2020/11/13 Python
Python的logging模块基本用法
2020/12/24 Python
英国著名的小众美容品牌网站:Alyaka
2017/08/08 全球购物
阿玛瑞酒店中文官方网站:Amari.com
2018/02/13 全球购物
西班牙最大的在线滑板和街头服饰商店:Fillow.net
2019/04/15 全球购物
文秘专业毕业生就业推荐信
2013/11/08 职场文书
委托证明的格式
2014/01/10 职场文书
上班看电影检讨书
2014/02/12 职场文书
初中班主任评语
2014/04/24 职场文书
财务部绩效考核方案
2014/05/04 职场文书
人民调解协议书范本
2014/10/11 职场文书
2014年档案室工作总结
2014/12/01 职场文书
2015年党建工作目标责任书
2015/05/08 职场文书
传单、海报早OUT了,另类传单营销方案送给你!
2019/07/15 职场文书
《正面管教》读后有感:和善而坚定的旅程
2019/12/19 职场文书
Feign调用全局异常处理解决方案
2021/06/24 Java/Android