vue-router使用next()跳转到指定路径时会无限循环

解释1

beforeRouteLeave (to, from, next) {console.log('离开路路由')if(to.fullPath==='/home'){next();}else{next('/home')}

这个是组件路由,我想实现的效果是在这个页面点击浏览器的返回按钮后要返回 /home页面而不是上一个页面,上面的代码是没问题的,而我之前的写法就一直死循环

// 下面的写法会死循环beforeRouteLeave (to, from, next) {console.log('离开路路由')next('/home')
}

vue-router的next()方法无参和有参时是不一样的

当执行钩子函数时如果遇到next(’/home’)等时会中断当前导航,
比如当前导航是去/a,那么遇到next(’/home’)后就会把to.path改为/home,然后会重新触发这个离开的钩子,
注意:此时会重新触发执行这个钩子,而不是在这个钩子函数继续执行的

当重新触发后就会继续执行next(’/home’)所以会一直循环
。至于解决办法就是判断下,如果已经是/home了就next()。
解释2
为什么next()指定路径会出现死循环

router.beforeEach((to, from, next) => {console.log('beforeEach');if(true){next('/');}else{next();}
});

next()直接跳转到to.path路径,没有再执行一遍beforeEach导航钩子,next(’/’)或者next(’/login’)自己指定路径的,路由跳转的时候还执行一遍beforeEach导航钩子,所以上面出现死循环;
栗子:如我们登录页(’/login’)面进入首页(’/’),可以这么写:

router.beforeEach((to, from, next) => {
var userInfo= JSON. parse(sess ionStorage. getItem('userInfoStorage'));//获取浏览器缓存的用户信息
if(userInfo){//如果有就直接到首页咯
next() ;
}else{
if(to. path==' /login' ){//如果是登录页面路径,就直接next()
next() ;
}else{//不然就跳转到登录;
next(' /login');
}
}
});

问题
出现无限循环是因为之前我没有弄清楚next()流程
因为每次跳转到一个路由的时候都会 触发 全局守卫 由于判断条件未改变 所以 一直循环

解决方法

判断to路由的meta (isRequireAuthTrue)是否为true
判断是否登陆(isLogin)

// ('/')为登陆界面  
// next() 默认跳转to的path
if(isRequireAuthTrue){if(isLogin){console.log('导航守卫保护');next(); //成功则跳转}else {console.log('你还没有登陆!');next({path:'/'}) //失败则跳转到登陆页面}}else {next();//不需要导航守卫的则直接next跳转}

解释3
问题描述:在调用Vue中的全局前置导航守卫beforeEach(to, from, next)中的next函数,在给next()传参数的时候出现死循环的问题!导致问题原因:其实导致这个问题的根本是没有完全理解beforeEach()和next("/somewhere")的作用首先,我们来看看next()的用法
在这里插入图片描述
究其根本是当执行了next("/somewhere")的时候又触发了beforeEach()这个钩子,所以就变成了无限死循环!

解决办法:

router.beforeEach((to, from, next) => {let {path} = to;if(path=== "/somewhere") {next(); // 导航目的地符合预期,继续后续事情}else {next("/somewhere");  // 导航目的地不符合预期,重新路由新路径地址,然后会再次触发beforeEach钩子并进行二次判断}
});

解释4
页面跳墙中使用 vue-router中的 beforeEach的死循环问题

  • 问题展现
import Router from 'vue-router'
const router = new Router({{path: '/', component: index },{path: '/login', component: login},{path: '/error', component: error},{path: '*', component: error}
})router.beforeEach((to, from, next) => {const isLogin = sessionStorage.getItem('loginData')if (isLogin) {next()} else {next('/error')} 
})

最近在使用时,一直陷入死循环,当时的想法是如何将路由提取出来,脱离beforeEach的控制,之后发现不可行。上面问题再现,会出现死循环,因为 /error 会在进入前 又要进入beforeEach中 ,这样就会一直循环下去
所以就是想如何跳出这个循环即可

router.beforeEach((to, from, next) => {const isLogin = sessionStorage.getItem('loginData')if (isLogin) {next()} else {//next('/error')if (to.path === '/error') { //这就是跳出循环的关键next()} else {next('/error')}} 
})

这样写,其实这个会执行两次,第二次进来是以/error的路由进来的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/407253.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JS之按照Unicode返回指定字符串

用法:fromCharCode() 可接受一个指定的 Unicode 值,然后返回一个字符串 语法:String.fromCharCode(numX,numX,…,numX) 参数:必需。一个或多个 Unicode 值,即要创建的字符串中的字符的 Unicode 编码 注意&#xff1…

JSP标签中不要省略引号

<th> 输入po:<input name"po" value"<%po%>"/></th> <th>输入ip:<input name"ip" value"<%ip%>"/></th> 打算出来的界面如图 这个里面如果&#xff0c;"<%ip%>" 不…

JS之返回字符首次出现位置的indexOf

作用&#xff1a;indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置 语法&#xff1a;stringObject.indexOf(searchvalue,fromindex) 参数1&#xff1a;必需。规定需检索的字符串值 参数2&#xff1a;可选的整数参数。规定在字符串中开始检索的位置。它的合法…

JS之返回字符串最后出现的位置lastIndexOf

作用&#xff1a;lastIndexOf() 方法可返回一个指定的字符串值最后出现的位置&#xff0c;在一个字符串中的指定位置从后向前搜索 语法&#xff1a;stringObject.lastIndexOf(searchvalue,fromindex) 参数1&#xff1a;必需。规定需检索的字符串值 参数2&#xff1a;可选的整…

基于mint-ui的城市选择3级联动

1、实际效果 2、首先你需要去下载一个包含中国省份&#xff0c;城市&#xff0c;区县的数据 如下&#xff1a; https://github.com/artiely/Administrative-divisions-of-China&#xff08;里面包含二级联动数据&#xff0c;三级联动数据&#xff0c;四级联动数据等&#xff0…

JS之检索子字符串的search方法

作用&#xff1a;search() 方法用于检索字符串中指定的子字符串&#xff0c;或检索与正则表达式相匹配的子字符串 语法&#xff1a;stringObject.search(regexp) 参数&#xff1a;该参数可以是需要在 stringObject 中检索的子串&#xff0c;也可以是需要检索的 RegExp 对象。…

一个很有深度的C++内存问题---GDB调试(一)

先看代码(a.c)&#xff1a; #include <stdio.h>int main(int argc, char* argv[]){int a[4]{1,2,3,4};int *ptr1(int*)(&a1);int *ptr2(int*)((int)a1);int *ptr3(int*)(a1);printf("a %x, &a %x, &a1 %x, (int)a1 %x\n", a, &a, &a1…

咬文嚼字——1

看点&#xff1a;作者王琦 勘误&#xff1a;张琦等编著 出处&#xff1a;永正网上购书中心 [url]http://www.erbook.com.cn/list.asp?sp_code9787121067921[/url] 《案例精解企业级网络构建》六位主创人员博客地址&#xff1a; 张琦&#xff1a; [url]http://zhangqi.blog.51…

HTML DOM之属性的各种操作方法

1.element.getAttribute(attributename)方法用来返回指定属性名的属性值&#xff0c;返回的类型是字符串类型 2.element.getAttributeNode(attributename)方法从当前元素节点(nodeType值为1的节点)element中通过名称获取属性节点(nodeType值为2的节点)&#xff0c;返回值是指定…

CSS Grid布局(2)

6.间距 grid-column-gap和grid-row-gap属性用来创建列与列&#xff0c;行与行之间的间距 间距(Gap)可以设置任何非负值&#xff0c;长度值可以是px、%、em等单位值 grid-gap是grid-row-gap和grid-column-gap两个属性的缩写 如果它指定了两个值&#xff0c;那么第一个值是设置…

React开发(124):ant design学习指南之form中的属性isFieldTouched

没有值的时候返回提示的error 有值返回undefined

HDU 4990 Ordered Subsequence --数据结构优化DP

题意&#xff1a;给一串数字&#xff0c;问长度为m的严格上升子序列有多少个 解法&#xff1a;首先可以离散化为10000以内&#xff0c;再进行dp&#xff0c;令dp[i][j]为以第i个元素结尾的长度为j的上升子序列的个数&#xff0c; 则有dp[i][j] SUM(dp[k][j-1]) (a[k] < a[…

CSS Grid布局(3)

10.网格线命名 通过grid-template-rows和grid-template-columns定义网格时&#xff0c;网格线可以被命名。网格线名称也可以设置网格项目位置 grid-template-rows和grid-template-columns定义你的网格&#xff0c;将名称分配给网格线 定义网格线名称时需要避免使用规范中出现…

VS 2010 OpenGL 配置与实例开发

首先参考了网上的安装配置环境部分&#xff1a;http://blog.csdn.net/Ididcan/article/details/4490797 最近准备学习OpenGL,结果发现敲入书中给的代码&#xff0c;居然提示头文件找不到&#xff0c;相当郁闷&#xff0c;查了一下才发现有些不是VC自带的&#xff0c;需要自己下…

NODE属性说明

注&#xff1a;文本节点、元素节点或者注释节点等都是Node类型的子类&#xff0c;它们继承自Node类&#xff0c;所以这里的node可以是任何一种节点类型 1.node.nodeType用来以数字值返回指定节点node的节点类型 2.node.nodeName用来返回指定节点的节点名称 如果节点是元素节点…