解决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页面动态显示时间变化示例代码
Dec 18 Javascript
javascript版2048小游戏
Mar 18 Javascript
Node.js巧妙实现Web应用代码热更新
Oct 22 Javascript
javascript运动框架用法实例分析(实现放大与缩小效果)
Jan 08 Javascript
JQueryEasyUI之DataGrid数据显示
Nov 23 Javascript
js定时器实例分享
Dec 20 Javascript
easyUI实现类似搜索框关键词自动提示功能示例代码
Dec 27 Javascript
js单页hash路由原理与应用实战详解
Aug 14 Javascript
微信小程序之GET请求的实例详解
Sep 29 Javascript
Angular 5.x 学习笔记之Router(路由)应用
Apr 08 Javascript
简述vue状态管理模式之vuex
Aug 29 Javascript
微前端qiankun改造日渐庞大的项目教程
Jun 21 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
header()函数使用说明
2006/11/23 PHP
PHP计算一年多少个星期和每周的开始和结束日期
2014/07/01 PHP
个人写的PHP验证码生成类分享
2014/08/21 PHP
php常用字符串处理函数实例分析
2014/11/22 PHP
fckeditor上传文件按日期存放及重命名方法
2015/05/22 PHP
ThinkPHP的SAE开发相关注意事项详解
2016/10/09 PHP
php封装的验证码类分享
2017/02/26 PHP
PHP7扩展开发教程之Hello World实现方法示例
2017/08/03 PHP
PHP封装类似thinkphp连贯操作数据库Db类与简单应用示例
2019/05/08 PHP
非常好的js代码
2006/06/27 Javascript
jquery $.ajax入门应用一
2008/11/19 Javascript
一些常用的JS功能函数代码
2009/06/23 Javascript
JavaScript Event学习第四章 传统的事件注册模型
2010/02/07 Javascript
jQuery 位置函数offset,innerWidth,innerHeight,outerWidth,outerHeight,scrollTop,scrollLeft
2010/03/23 Javascript
JavaScript之appendChild、insertBefore和insertAfter使用说明
2010/12/30 Javascript
jQuery结合CSS制作漂亮的select下拉菜单
2015/05/03 Javascript
AngularJS+Bootstrap实现多文件上传与管理
2016/11/08 Javascript
基于vue实现分页/翻页组件paginator示例
2017/03/09 Javascript
Javascript实现时间倒计时效果
2017/07/15 Javascript
VSCode 配置React Native开发环境的方法
2017/12/27 Javascript
AngularJs的UI组件ui-Bootstrap之Tooltip和Popover
2018/07/13 Javascript
JavaScript设计模式之构造器模式(生成器模式)定义与用法实例分析
2018/07/26 Javascript
解决vue项目F5刷新mounted里的函数不执行问题
2019/11/05 Javascript
python 实现将字典dict、列表list中的中文正常显示方法
2018/07/06 Python
python中利用numpy.array()实现俩个数值列表的对应相加方法
2019/08/26 Python
pytorch GAN伪造手写体mnist数据集方式
2020/01/10 Python
Python常用库大全及简要说明
2020/01/17 Python
python通过安装itchat包实现微信自动回复收到的春节祝福
2020/01/19 Python
python批量生成身份证号到Excel的两种方法实例
2021/01/14 Python
html5 拖拽及用 js 实现拖拽功能的示例代码
2020/10/23 HTML / CSS
环境科学专业个人求职信
2013/12/15 职场文书
《自然之道》教学反思
2014/02/11 职场文书
行政主管职责范本
2014/03/07 职场文书
党委班子纠正“四风”问题整改措施
2014/10/28 职场文书
浅谈Redis中的RDB快照
2021/06/29 Redis
Nginx反向代理、重定向
2022/04/13 Servers