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…

顺序容器STL::list用法

C Code: // 顺序容器STL::list用法#include<iostream>#include <stdio.h>#include <stdlib.h>#include <list>using namespace std;void appendItems(list<int> &li, int n){for(int i 0; i < n; i){li.push_back(i1);}}void appendIte…

搭建自己的base.js(2)-其他事件方法

获取鼠标按键 // 获取鼠标按键,getButton:function(event) {//DOM,先检测是否支持DOM鼠标事件if(document,implementation.hasFeature("MouseEvents","2.0")) {return event.button; //0主键&#xff0c;1滚轮&#xff0c;2次键} else { //IE8及之前switc…

Linux下的压缩zip,解压缩unzip命令详解及实例

zip all.zip *.jpg #将所有.jpg的文件压缩成一个zip包unzip all.zip #将all.zip中的所有文件解压到当前目录中unzip all.zip -d all #将all.zip 中的所有文件解压到当前目录中的all文件夹中zip -r hy.zip hy #将当前目录下的hy文件夹压缩为hy.zipzip -r hy.zip hy 123.tx…

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;可选的整数参数。规定在字符串中开始检索的位置。它的合法…

vsftpd默认用户名/密码

我的Linux系统是Fedora12&#xff0c;在它上面安装vsftpd的步骤是&#xff1a; yum install vsftpd 安装好后&#xff0c;要启动vsftpd服务&#xff1a;service vsftpd start 停止服务&#xff1a;service vsftpd stop 重启服务&#xff1a;service vsftpd restart 查看状态…

怎样设计接口?

怎样设计接口&#xff1f; 众所周知&#xff0c;接口是提供给其它模块或者系统使用的一种约定或者规范。因此接口必需要保证足够的稳定性和易用性。这是设计接口的基本要求。 1.稳定性 接口必须相对稳定&#xff0c;否则将导致接口的使用者和提供者为了适应新接口而不断改动接口…

软件工程心理学之9----乙方如何面对甲方2

(本文同步发布在javaeye.com上,转载请保留出处) 在http://www.cnblogs.com/jackyrong/archive/2006/11/08/554694.html中, 大概谈了下如何应对甲方的领导。这次要谈的就是很重要的如何应对甲方的信息项目的负责人了。这其实也是相当重要的一部分&#xff0c;在打通了和甲方领导…

input禁止输入的方法

1&#xff1a; readonly规定输入字段为只读可复制&#xff0c;但是&#xff0c;用户可以使用Tab键切换到该字段&#xff0c;可选择,可以接收焦点&#xff0c;还可以选中或拷贝其文本。 <input type"text" value"哈哈哈" readonly"readonly"&g…

linux下gdb常用的调试命令

From: http://blog.csdn.net/schoolers/article/details/6743223 用gdb调试程序时&#xff0c;常常很困惑一些命令的使用&#xff0c;要么是不知道这个命令&#xff0c;要么忘了命令的使用方法。 呵呵&#xff0c;有时迷茫了自己处在什么堆栈的深处&#xff0c;这是使用where命…

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

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

博客园访问量有些小,我就没有必要在复制一份了,博客园就这样吧,继续CSDN了。...

博客园访问量有些小&#xff0c;我就没有必要在复制一份了&#xff0c;博客园就这样吧&#xff0c;继续CSDN了。转载于:https://www.cnblogs.com/Silence-AC/p/3953046.html

死循环-批处理

echo off:loopstart cmd.exegoto :loop注&#xff1a;其中 &#xff1a;loop为循环标记cmd.exe程序可以更换为其他程序如你的电脑性能好的话可以用shutdown -a来结束转载于:https://blog.51cto.com/aizzw/101246

基于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 对象。…

React开发(122):动态表头核心配置 外层绑定key

Object.keys()的用法 作用&#xff1a;遍历对象 返回结果&#xff1a;返回对象中每一项key的数组 // 1. 定义一个对象var obj { 0:大,1:二,2:光强 }// 2. 使用Object.keys()方法var keyValue Object.keys(obj)// 3. 打印结果console.log(keyValue) // 得到是&#xff1a;[&q…

一个很有深度的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…