导航守卫常见报错 Maximum call stack size exceeded :超出最大调用堆栈大小

我在写 导航前置守卫的时候 经常出现堆栈溢出的错误 也能修改解决 但是一直不知到为什么

今天 认真总结如下【希望有同样问题的能有一些帮助】:

import store from '@/store'
router.beforeEach((to, from, next) => {
  // to.path 你要 跳转到那里去
  // from。path 从 那个地址 跳转的
  // next() --允许跳转  next(false) --不允许跳转  next('/login') --跳转到指定的位置

  //简单 只把错误代码写出来
  if(!store.state.user.token) return next('/login')
})

原始想法:

我希望通过判断token的有无来进行 跳转登录页的控制

但是他直接给我报错了【堆栈溢出】我试着分析了一下造成这种错误的可能性

错误原因

因为出现了死循环【比如递归 for 等死循环】 

疑惑:

但是在我的源码中并没有 以上 常规能够造成死循环的代码【只是用了一个简单的不能在简单的if判断 为什么就造成了死循环?】

解释:

在上面这句代码中 因为出现了跳转 语句 但是没有判断跳转是否成功 的方法所以 造成了

token 不存在 就一直在跳转 直到超出堆栈调用的最大限度

我们简单的来理解一下跳转语句

// 在跳转中的等同关系
next('/login) === this.$router.push('/login')

next('/login') // 的触发会被导航守卫捕捉到 再次进行判断跳转后的结果

佐证:

//报错👇 超出堆栈最大调用 【出现死循环,导航守卫被多次触发】
if(!store.state.user.token) return next('/login') 

// 修改后的代码👇 添加了当跳转成功的判断 不在报错 正常运行 
if(!store.state.user.token && to.path !== '/login') return next('/login')  

!!!当发生跳转 再次触发导航守卫 

我最近在玩智能AI的时候问了它这个问题,给大家截个图看一下 它的回答:

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值