关于vue-router全局前置守卫中beforeEach()里的代码循环执行的问题

问题背景

几乎有登陆功能的站点都会有这一种流程: 用户想评论,点赞等有用户信息的行为站点如果检测到用户还没登陆,就会跳到登陆页进行登陆。而vue-Router中的全局前置守卫可谓十分适宜做这个功能,即beforeEach()钩子函数。按着这理解,我写下了以下代码;

import Vue from 'vue'
import Router from 'vue-router'
import QuiArrow from '@/components/quiArrow'
import QuiButton from '@/components/quiButton'
import QuiList from '@/components/quiList'
import QuiNav from '@/components/quiNav'
import login from '@/components/login'
Vue.use(Router)

const router =  new Router({
//   mode:"history",//消除地址栏的#号
  routes: [
	{
		path:"/arrow",
		name:"arrow",
		component: QuiArrow
	},
	{
		path:"/button",
		name:"button",
		component: QuiButton
	},
	{
		path:"/list",
		name:"list",
		component: QuiList
	},
	{
		path:"/nav",
		name:"nav",
		component: QuiNav
	},
	{
		path:"/login",
		name:"login",
		component: login
	},
	
	

  ],
  
})


//主要看这个,这个东西就是全局前置守卫
router.beforeEach((to, from, next) => {
	if(localStorage.getItem("isLogin")!= "1") {
		next('/login')
	}
	next()
})

export default router

结果~~~~
关于vue-router全局前置守卫中beforeEach()里的代码循环执行的问题_第1张图片
得了,又是循环调用停不下来爆栈了

问题解决

这个问题我是这样理解的:
next() 表示路由成功,直接进入to路由,不会再次调用router.beforeEach()
next(“login’) 表示路由拦截成功,重定向至login,会再次调用router.beforeEach()
也就是说beforeEach()必须调用next(),否则就会出现无限循环,next() 和 next(‘xxx’) 是不一样的,区别就是前者不会再次调用router.beforeEach(),后者会!!!

按这个理解,后面的beforeEach()里的内容写成这样:

if(localStorage.getItem("isLogin") == "1") {
		next()
	}
	else {
		if(to.name == 'login') {
			next()
		}
		else {
			next('/login')
		}
		
	}

记住,在登陆操作完成后得把标志登陆的状态信息改了,要不总是保留在登陆页

你可能感兴趣的:(vue,前端)