解决vue-router路由拦截造成死循环问题


Posted in Javascript onAugust 05, 2020

笔记:vue-router路由拦截造成死循环,在做路由拦截的时候,一直出现死循环.

router的index.js文件路由配置

const router = new Router({
routes: [{path: '/login',name: 'login',component: Login,meta: {isShow: true}},
    {path: '/',component: Layout,redirect: '/home',meta: {title: "首页菜单"},
    children: [{ path: 'home', name: 'home', component: () => import('@/views/Hmoe'),
    meta: { title: "首页" } }],}]
})

一开始路由拦截是这样写的,但是这样的结果就是,在token存在的时候,可以直接访问login页面,但是实际项目中是,在token存在的时候不能可以访问login页面

router.beforeEach((to, from, next) => {
 if (!to.meta.isShow && !sessionStorage.getItem("token")) {
  return next('/login');
 }
 next();
})

根据项目的需求进行修改,然后就出现下图的报错,出现了死循环

router.beforeEach((to, from, next) => {
 if (sessionStorage.getItem("token")) {
  if (to.meta.isShow) {
   next('/home')
  } else {
   next()
  }
 } else {
  next('/login');
 }
})
 
//检查代码
router.beforeEach((to, from, next) => {
 if (sessionStorage.getItem("token")) {
  if (to.meta.isShow) {
   console.log("1")
   next('/home')
  } else {
   console.log("2")
 
   next()
  }
 } else {
  console.log("3")
  next('/login');
 }
})

解决vue-router路由拦截造成死循环问题

解决vue-router路由拦截造成死循环问题

然后接着进行修改,就把浏览器弄崩溃了,此处省略一万字T_T.......

最后修改的代码,终于得到了最终的需要的结果

router.beforeEach((to, from, next) => {
 if (sessionStorage.getItem('token')) {//toekn存在
  if (to.path == '/login') {//token存在,并且是login页面
   next('/home');
  } else {//token存在,不是login页面
   next();
  }
 } else {
  if (to.path == '/login') {//token不存在,并且是login页面
   next();
  } else {//token不存在,不是login页面
   next('/login');
  }
 }
});

关于vue-router导航守卫,官方给出的解释是

解决vue-router路由拦截造成死循环问题

出现无限循环是因为之前我没有弄清楚next()流程

因为每次跳转到一个路由的时候都会 触发 全局守卫 由于判断条件未改变 所以 一直循环

关于上面代码我自己的理解,就是当token存在的时候,判断页面是否是login页面,如果是就next到首页,不是就直接next。如果token不存在,页面为login就直接next,不是login就直接next到login页面,因为一开始在第一个else里面没有做判断,那么他的条件一直未改变,所以他会一直重复next到login才造成的死循环,后面写了判断之后就正常了....

补充知识:vue-router promise问题

最近在项目中使用element发现了一个bug

侧边栏list 点击没问题 如果在这个点击页面 在点击一次router-link 就会报错 但是不影响功能

去你引用vue-router的页面添加一段代码

const originalPush = Router.prototype.push
Router.prototype.push = function push(location) {
return originalPush.call(this, location).catch(err => err)
}

以上这篇解决vue-router路由拦截造成死循环问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
理解Javascript_13_执行模型详解
Oct 20 Javascript
jQuery 表单验证扩展(四)
Oct 20 Javascript
jQuery性能优化的38个建议
Mar 04 Javascript
JavaScript定义变量和变量优先级问题探讨
Oct 11 Javascript
javascript实现将数字转成千分位的方法小结【5种方式】
Dec 11 Javascript
基于vue.js无缝滚动效果
Jan 25 Javascript
JavaScript 五大常见函数
Mar 23 Javascript
Vue单页及多页应用全局配置404页面实践记录
May 22 Javascript
Vue的watch和computed方法的使用及区别介绍
Sep 06 Javascript
在Bootstrap开发框架中使用dataTable直接录入表格行数据的方法
Oct 25 Javascript
你不可不知的Vue.js列表渲染详解
Oct 01 Javascript
使用react+redux实现计数器功能及遇到问题
Jun 02 Javascript
Vue基于iview table展示图片实现点击放大
Aug 05 #Javascript
vue相同路由跳转强制刷新该路由组件操作
Aug 05 #Javascript
解决vue路由name同名,路由重复的问题
Aug 05 #Javascript
解决vue项目input输入框双向绑定数据不实时生效问题
Aug 05 #Javascript
Vue 同步异步存值取值实现案例
Aug 05 #Javascript
详解vue路由
Aug 05 #Javascript
解决vue使用vant下拉框van-dropdown-item 绑定title值不变问题
Aug 05 #Javascript
You might like
PHP的mysqli_query参数MYSQLI_STORE_RESULT和MYSQLI_USE_RESULT的区别
2014/09/29 PHP
php简单判断文本编码的方法
2015/07/30 PHP
PHP对象克隆clone用法示例
2016/09/28 PHP
静态的动态续篇之来点XML
2006/12/23 Javascript
javascript 关于# 和 void的区别分析
2009/10/26 Javascript
jquery必须知道的一些常用特效方法及使用示例(整理)
2013/06/24 Javascript
JS版的date函数(和PHP的date函数一样)
2014/05/12 Javascript
纯JavaScript实现的兼容各浏览器的添加和移除事件封装
2015/03/28 Javascript
Javascript进制转换实例分析
2015/05/14 Javascript
AngularJS基础 ng-model 指令详解及示例代码
2016/08/02 Javascript
JS模拟实现方法重载示例
2016/08/03 Javascript
浅谈JavaScript正则表达式-非捕获性分组
2017/03/08 Javascript
通过vue-cli来学习修改Webpack多环境配置和发布问题
2017/12/22 Javascript
js中事件对象和事件委托的介绍
2019/01/21 Javascript
详解element-ui中表单验证的三种方式
2019/09/18 Javascript
JS+CSS实现3D切割轮播图
2020/03/21 Javascript
Node.js API详解之 string_decoder用法实例分析
2020/04/29 Javascript
[02:05:03]完美世界DOTA2联赛循环赛 LBZS VS Matador BO2 10.28
2020/10/28 DOTA
pandas数据处理基础之筛选指定行或者指定列的数据
2018/05/03 Python
opencv-python 读取图像并转换颜色空间实例
2019/12/09 Python
Python稀疏矩阵及参数保存代码实现
2020/04/18 Python
Python grequests模块使用场景及代码实例
2020/08/10 Python
AmazeUI 单选框和多选框的实现示例
2020/08/18 HTML / CSS
德国在线香料制造商:Gewürzland
2020/03/10 全球购物
百度软件工程师职位
2013/02/14 面试题
食品安全工作方案
2014/05/07 职场文书
户外宣传策划方案
2014/05/25 职场文书
村干部群众路线教育活动对照检查材料
2014/10/01 职场文书
教师党的群众路线教育实践活动剖析材料
2014/10/09 职场文书
入党积极分子对十八届四中全会期盼的思想汇报
2014/10/17 职场文书
养成教育工作总结
2015/08/13 职场文书
组织委员竞选稿
2015/11/21 职场文书
十大好看的穿越动漫排名:《瑞克和莫蒂》第一,国漫《有药》在榜
2022/03/18 日漫
利用For循环遍历Python字典的三种方法实例
2022/03/25 Python
MySQL数据库实验实现简单数据库应用系统设计
2022/06/21 MySQL
win10忘记pin密码登录不了怎么办?win10忘记pin密码登不进去的解决方法
2022/07/07 数码科技