解决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 相关文章推荐
JQuery CSS样式控制 学习笔记
Jul 23 Javascript
jquery 多级下拉菜单核心代码
May 21 Javascript
基于JQuery实现的类似购物商城的购物车
Dec 06 Javascript
alert中断settimeout计时功能
Jul 26 Javascript
jQuery 浮动导航菜单适合购物商品类型的网站
Sep 09 Javascript
jQuery-1.9.1源码分析系列(十一)DOM操作续之克隆节点
Dec 01 Javascript
JavaScript中对象的不同创建方法
Aug 12 Javascript
手动初始化Angular的模块与控制器
Dec 26 Javascript
jQuery实现的手风琴侧边菜单效果
Mar 29 jQuery
jQuery实现的老虎机跑动效果示例
Dec 29 jQuery
JS隐藏号码中间4位代码实例
Apr 09 Javascript
vant picker+popup 自定义三级联动案例
Nov 04 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 和 MYSQL
2006/10/09 PHP
function.inc.php超越php
2006/12/09 PHP
php根据身份证号码计算年龄的实例代码
2014/01/18 PHP
ThinkPHP模版中导入CSS和JS文件的方法
2014/11/29 PHP
PHP 记录访客的浏览信息方法
2018/01/29 PHP
Laravel 默认邮箱登录改成用户名登录的实现方法
2019/08/12 PHP
2007/12/23更新创意无限,简单实用(javascript log)
2007/12/24 Javascript
jquery的ajax请求全面了解
2013/03/20 Javascript
window.open()详解及浏览器兼容性问题示例探讨
2014/05/29 Javascript
详解jQuery的Cookie插件
2016/11/23 Javascript
angularJS+requireJS实现controller及directive的按需加载示例
2017/02/20 Javascript
详解webpack 打包文件体积过大解决方案(code splitting)
2018/04/10 Javascript
通过jquery的ajax请求本地的json文件方法
2018/08/08 jQuery
微信小程序开发之路由切换页面重定向问题
2018/09/18 Javascript
Vue表单控件绑定图文详解
2019/02/11 Javascript
解决Layui中templet中a的onclick参数传递的问题
2019/09/20 Javascript
浅谈小程序globalData的那些事儿
2019/11/01 Javascript
原生JS实现留言板
2020/03/26 Javascript
Python生成器(Generator)详解
2015/04/13 Python
python脚本实现xls(xlsx)转成csv
2016/04/10 Python
python如何获取服务器硬件信息
2017/05/11 Python
python 利用pandas将arff文件转csv文件的方法
2019/02/12 Python
python三大神器之fabric使用教程
2019/06/10 Python
python实现人工智能Ai抠图功能
2019/09/05 Python
Python configparser模块封装及构造配置文件
2020/08/07 Python
python可视化 matplotlib画图使用colorbar工具自定义颜色
2020/12/07 Python
CSS3使用border-radius属性制作圆角
2014/12/22 HTML / CSS
Ruby如何实现动态方法调用
2012/11/18 面试题
怎样写演讲稿
2014/01/04 职场文书
后勤主管岗位职责
2014/03/01 职场文书
2014工程部年度工作总结
2014/12/17 职场文书
团拜会主持词
2015/07/04 职场文书
2019入党申请书格式
2019/06/25 职场文书
Go 实现英尺和米的简单单位换算方式
2021/04/29 Golang
golang elasticsearch Client的使用详解
2021/05/05 Golang
CSS基础详解
2021/10/16 HTML / CSS