【vue2小知识】路由守卫的使用与解决RangeError: Maximum call stack size exceeded问题的报错。

news2024/9/24 6:12:49

1d43f75f092a4050a8ce31e2d85f6868.gif

🥳博       主:初映CY的前说(前端领域)

🌞个人信条:想要变成得到,中间还有做到!

🤘本文核心:当我们在路由跳转前与后我们可实现触发的操作

【前言】当我们在做类似于登录页面的时候,从登录页跳转到首页需要对token做一个判断,如果我们的token存在的话那么我们就可以直接进行跳转,如没有token的话会自动跳转登录页。或者当我们在处理页面跳转时,对某一些条件进行一个判断,true走什么路径/false走什么路径。

 补充路由的声明与写法详见:http://t.csdn.cn/YCsD7 

文末附所有的源码


目录

一、路由守卫介绍

1.什么是路由导航守卫?

2.为什么要有路由导航守卫?

3.路由导航守卫有哪些?

二、路由守卫的使用

1.前置守卫

2.后置守卫

三、路由守卫对比拦截器区别

四、学习小结


一、路由守卫介绍

1.什么是路由导航守卫?

通俗来讲就是我们在路由跳转的时候执行的一个回调函数

守卫:类似于门卫,你做某件事之前会对你进行一个检查

2.为什么要有路由导航守卫?

在项目开发中,并不是每一个路由跳转都是明确的。 例如很多页面跳转需要登录判断,如果你有登录,则跳转到指定页面,没有登录则跳转到登录页面。

  • 举例子:我想进小区(个人信息),门卫(导航守卫)会检查我有没有做核酸(是否登录),如果做了就让我进去(跳转个人信息)。没做就让我去核酸点(登录页面)做完核算才可以进去。

3.路由导航守卫有哪些?

前置守卫:跳转前执行

后置勾子:跳转后执行

二、路由守卫的使用

1.前置守卫

  •  1. 所有的路由一旦被匹配到,在真正渲染解析之前,都会先经过全局前置守卫
  •  2. 只有全局前置守卫放行,才能看到真正的页面

参数写法:

 任何路由,被解析访问前,都会先执行这个回调

  1. from 你从哪里来, 从哪来的路由信息对象
  2.  to   你往哪里去, 到哪去的路由信息对象
  3.  next() 是否放行,如果next()调用,就是放行 => 放你去想去的页面
  4. next(路径) 拦截到某个路径页面

 我们创建文件打印一下查看下:

router.beforeEach((to, from, next) => {
  console.log(to, 'to目的路由')
  console.log(from, 'from从哪里来')
  next() // 必须写next()
})

控制台效果查看:

当我配置好路由时,点击跳转时控制台打印打印to\from,页面实现了跳转到了B页面并且我们的to与from当中都包含了我们去的路由信息。 

一定要注意,在导航守卫中必须要调用next()否则你的路由无法跳转


此时我引入下前置守卫:在路由跳转的前先执行我们写的回调函数

我想实现的效果:如果我去B页面就放行,当我不去B页面的时候就都跳转到C页面去。

按照常规的逻辑书会是这样的:


router.beforeEach((to, from, next) => {
  // console.log(to, 'to目的路由')
  // console.log(from, 'from目的路由')
  console.log(to.path, ' --to    ', from.path, ' --from')
  if (to.path === '/BPage') {
    console.log('前置守卫被触发')
    next()
  } else {
    console.log('不是去BPage与CPage的路由走这')
    next('/CPage')
  }
})

逻辑上并没有什么问题:当我不去B页面的时候,守卫就帮我切换到C页面去。可当博主打开控制台查看的时候却出现了:

 很奇怪,为什么重复跑路由呢?后在一群大佬一起分析找到了报错的原因:

我的判断没有写的完善,当我路由跳转时便又会触发一次路由守卫。因此会出现一直反复执行路由守卫,直到出现红字的报错:

RangeError: Maximum call stack size exceeded

当我尝试用翻译可得知,原来是我路由重复的跳执行直到将我的内存占满了。

 因此我们需要做出下以下的改变:再判断的时候加一条去CPage就给与放行。这样重复跑的时候遇到了CPage就放行了让他去CPage

修改后源代码见下:

router.beforeEach((to, from, next) => {
  // console.log(to, 'to目的路由')
  // console.log(from, 'from目的路由')
  console.log(to.path, ' --to    ', from.path, ' --from')
  if (to.path === '/BPage' || to.path === '/CPage') {
    console.log('前置守卫被触发')
    next()
  } else {
    console.log('不是去BPage与CPage的路由走这')
    next('/CPage')
  }
})

 这样就完美的实现了我们的需要:去BPage放行,不是BPage统一放行到CPage

 最重要的是:

我们在路由进行跳转的前可以看到我们执行了我们写在前置守卫中的回调函数


2.后置守卫

实现当我们路由跳转之后实现我们回调函数

参数写法:

当我们的路由进行跳转之后我们将会执行一个回调函数

  1. from 你从哪里来, 从哪来的路由信息对象
  2.  to   你往哪里去, 到哪去的路由信息对象

 原理同前置守卫只是不需要写next()

// 后置守卫
router.afterEach((to, from) => {
  console.log(to, 'to')
  console.log(from, 'from')
  if (to.path === '/BPage') {
    console.log('后置守卫被触发')
  } else {
    console.log('不是去BPage走这里(后置)')
  }
})

控制台效果查看:

 可以看到当我们的路由跳转结束后会执行我们的回调函数


三、路由守卫对比拦截器区别

刚开始接触路由导航守卫你会发现和axios拦截器有点像,实际上它们是两个不同的东西。

1.相同点

(1)都是钩子函数(回调函数的一种,到某个时机了自动触发)

(2)都是起到拦截作用

2.不同点

(1)功能不同 : axios拦截器拦截网络请求, 导航守卫拦截路由跳转

(2)应用场景不同 :

axios拦截器一般用于发送token

导航守卫用于页面跳转权限管理(有的页面可以无条件跳转,例如登录注册页可以无条件跳转。有的页面需要满足条件才能跳转,例如购物车页面就需要用户登录才可以跳转)

四、学习小结

1.前置守卫

  •  1. 所有的路由一旦被匹配到,在真正渲染解析之前,都会先经过全局前置守卫
  •  2. 只有全局前置守卫放行,才能看到真正的页面,需要写next()

2.后置守卫

  1. 当路由实现跳转之后我们再走后置守卫执行我们的后置守卫
  2. 对比前置守卫不需要写next()

[上述所有的源代码以及相关路由源代码]

router/index.js

import Vue from 'vue'
import VueRouter from 'vue-router'

// import BPage from '@/views/BPage',用了下面的新写法就不需要写导入路径
// import APage from '@/views/APage'
// import CPage from '@/views/CPage'

/*
前置守卫
 任何路由,被解析访问前,都会先执行这个回调
 1. from 你从哪里来, 从哪来的路由信息对象
 2. to   你往哪里去, 到哪去的路由信息对象
 3. next() 是否放行,如果next()调用,就是放行 => 放你去想去的页面
    next(路径) 拦截到某个路径页面
 */

Vue.use(VueRouter)

const routes = [
  {
    path: '/APage',
    name: 'APage',
    component: () => import('@/views/APage')
  },
  {
    path: '/BPage',
    name: 'BPage',
    component: () => import('@/views/BPage')
  },
  {
    path: '/CPage',
    name: 'CPage',
    component: () => import('@/views/CPage')
  }
]

const router = new VueRouter({
  routes
})

router.beforeEach((to, from, next) => {
  // console.log(to, 'to目的路由')
  // console.log(from, 'from目的路由')
  console.log(to.path, ' --to    ', from.path, ' --from')
  if (to.path === '/BPage' || to.path === '/CPage') {
    console.log('前置守卫被触发')
    next()
  } else {
    console.log('不是去BPage与CPage的路由走这')
    next('/CPage')
  }
})

// 后置守卫
router.afterEach((to, from) => {
  console.log(to, 'to')
  console.log(from, 'from')
  if (to.path === '/BPage') {
    console.log('后置守卫被触发')
  } else {
    console.log('不是去BPage走这里(后置)')
  }
})

export default router

App.vue

<template>
<div>
  <!-- 路由出口,必须写否则没有路由 -->
  <router-view ></router-view>
  <!-- 路由导航了类似于A超链接 -->
 <router-link to="/APage">AAA</router-link>

</div>
</template>

<script>
export default {

}
</script>
<style>
</style>

views/APage.vue

<template>
  <div>这是A页面
    <br>
    <button @click="$router.push('/BPage')">点我去B页面</button>
  </div>
</template>

<script>
export default {
  name: 'APage'

}
</script>

<style>

</style>

views/BPage.vue

<template>
  <div>这是B页面
    <br>
    <button @click="$router.push('/APage')">点我去A页面</button>
  </div>
</template>

<script>
export default {
  name: 'BPage'
}
</script>

<style>

</style>

views/CPage.vue

<template>
  <div>这是C页面
    <br>
    <button @click="$router.push('/APage')">点我去A页面</button>
  </div>
</template>

<script>
export default {
  name: 'CPage'
}
</script>

<style>

</style>

至此,本文结束!愿大家有所收获!

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

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

相关文章

jmeter-如何在多线程一起执行时,控制请求的执行顺序【临界部分控制器】

前言&#xff1a;一个线程多个脚本的时候&#xff0c;发现只要100个用户同时执行&#xff0c;请求就会乱。期望2个线程执行结果&#xff1a;获取验证码-注册-登录这个流程获取验证码-注册-登录这个流程实际2个线程执行结果&#xff1a;a. 登录-获取验证码-注册b. 注册-获取验证…

运动无线蓝牙耳机哪款好、运动无线蓝牙耳机推荐

作为 运动爱好者&#xff0c;每天早晨醒来后的第一件事就去家门口的湿地公园跑上一圈。各种运动装备都齐了&#xff0c;不过在耳机选择上还真的犯难&#xff0c;打着“运动耳机”旗号的产品也是种类繁多&#xff0c;那么到底什么样的无线耳机更适合运动呢&#xff1f;于是我花时…

零基础入门网络安全,看这一篇就够了!

前景 很多零基础朋友开始将网络安全作为发展的大方向&#xff0c;的确&#xff0c;现如今网络安全已经成为了一个新的就业风口&#xff0c;不仅大学里开设相关学科&#xff0c;连市场上也开始大量招人。 那么网络安全到底前景如何&#xff1f;大致从市场规模、政策扶持、就业…

vxe-table 表格多选框回显

1.弹框表格结构 <a-modal v-if"visibleQuality" title"请选择需要提高的能力素质要求" :maskClosable"false" :visible"visibleQuality && switchStatus" ok"handleOkQuality" cancel"handleCancelQuality&…

【微信小程序-原生开发+TDesign】通用功能页封装——地点搜索(含腾讯地图开发key 的申请方法)

效果预览 核心技能点 调用腾讯地图官方的关键字地点搜索功能&#xff0c;详见官方文档 https://lbs.qq.com/miniProgram/jsSdk/jsSdkGuide/methodGetsuggestion 完整代码实现 地点输入框 <t-input value"{{placeInfo.title}}" bindtap"searchPlace" dis…

华为OD机试模拟题 用 C++ 实现 - 端口合并(2023.Q1)

最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 最多获得的短信条数(2023.Q1)) 文章目录 最近更新的博客使用说明端口合并题目输入输出示例一输入输出说明示例二输入输出说明示例三输入输出说明

力扣299.猜数字游戏(java语言实现)

题目描述&#xff1a; 你在和朋友一起玩 猜数字&#xff08;Bulls and Cows&#xff09;游戏&#xff0c;该游戏规则如下&#xff1a; 写出一个秘密数字&#xff0c;并请朋友猜这个数字是多少。朋友每猜测一次&#xff0c;你就会给他一个包含下述信息的提示&#xff1a; 猜测…

JVM系统优化实践(5):什么时候GC以及有哪些GC

您好&#xff0c;我是湘王&#xff0c;这是我的CSDN博客&#xff0c;欢迎您来&#xff0c;欢迎您再来&#xff5e;既然程序运行会产生大量的废弃物&#xff0c;也就是「垃圾」&#xff0c;那总不能一直堆着不管吧。现在就来粗浅地谈谈Java里面什么时候会触发GC以及有哪些GC。通…

NBA Top Shot 跌落神坛

近日&#xff0c;美国职业篮球联盟&#xff08;NBA&#xff09;授权的NFT 项目“NBA Top Shot Moments”被纽约法院初步裁定为“可能符合证券的定义”&#xff0c;虽然这不是对2021年用户指控该项目违法的最终判决&#xff0c;但这个裁定引发了市场担忧&#xff0c;部分NFT的地…

Java的运算操作

个人主页&#xff1a;平行线也会相交 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 平行线也会相交 原创 收录于专栏【JavaSE_primary】 文章目录算术运算符增量运算符注意自增自减运算符关系运算符逻辑运算符逻辑与&&逻辑或||逻辑非&#xff01;…

直觉外科:手术机器人领域的领导者,未来还有巨大的增长空间

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 虽然直觉外科(ISRG)多年来一直在强劲的增长&#xff0c;但猛兽财经认为它未来仍有足够的空间进一步扩大收入和利润。虽然这个行业的竞争正在加剧&#xff0c;但猛兽财经认为从长远来看&#xff0c;这个市场可能会整合&…

如何修改JAR包内的代码

有时候由于找不到源码&#xff0c;只有一个jar包&#xff0c;但又想去修改jar包中的代码&#xff0c;就可以进行将jar包反编译后&#xff0c;修改&#xff0c;再重新编译的方式来实现。 一、下载反编译软件JD-GUI https://github.com/java-decompiler/jd-gui/releases 二、用…

Android 项目必备(四十二)-->Android 多窗口模式

简介 自由窗口模式: 该模式类似于常见的桌面操作系统&#xff0c; 应用界面的窗口可以自由的拖动和修改大小。 分屏模式 该模式可以在手机上使用&#xff0c; 该模式将屏幕一分为二&#xff0c; 同时显示两个应用界面。 画中画模式: 该模式主要用于TV&#xff0c; 在该模式下…

项目--基于RTSP协议的简易服务器开发(1)

RTSP协议简介&#xff1a;RTSP&#xff08;Real Time Streaming Prcotol&#xff09;是位于TCP\IP体系应用层的数据传输协议&#xff0c;通常的RTSP协议包含 RTSP、RTP、RTCP协议。一般而言&#xff1a;RTSP负责服务器与客户端之间的请求与响应RTP负责服务器、客户端之间传输媒…

【双U网络:传感器间自监督:全色锐化】

W-NetPan: Double-U network for inter-sensor self-supervised pan-sharpening &#xff08;W-NetPan&#xff1a;用于传感器间自监督全色锐化的双U网络&#xff09; 由于遥感数据的提供日益增多&#xff0c;可以通过全色锐化方法来处理空间-光谱限制。然而&#xff0c;融合…

【JavaGuide面试总结】操作系统篇·上

【JavaGuide面试总结】操作系统篇上1.什么是系统调用呢&#xff1f; 能不能详细介绍一下2.进程和线程的区别3.进程有哪几种状态?4.进程间的通信常见的的有哪几种方式呢?5.线程间的同步的方式有哪些呢?6.操作系统中进程的调度算法有哪些7.产生死锁的四个必要条件是什么?8.解…

KT148A语音芯片ic的供电电压以及电源输入的详细说明V1

目录 一、问题简介 二、详细说明 问题1&#xff1a;芯片的供电说明 问题2&#xff1a;我测试反而3.7V接到KT148A的7脚才能工作&#xff0c;正常吗&#xff1f; 问题3&#xff1a;分别测试了锂电池和USB供电&#xff0c;都不正常&#xff1f; 三、总结 完整的测试板如下图…

大型WMS系统源码 带扫码入库移动端源码

WMS的核心价值是降低成本&#xff0c;提高效率&#xff0c;能够反映和控制仓库各个环节的运作&#xff0c;实现事件前后的管理&#xff0c;为企业创造更高的效益。 WMS系统是智能仓库管理系统的缩写&#xff0c;WMS系统主要负责的是入库业务、出库业务、仓库调拨、库存调拨和虚…

Raspberry实践笔记—配置RobotFramework自动化测试环境

一般RobotFramework都是安装在Windows&#xff0f;Linux的PC机上&#xff0c;这里将简单介绍在树莓派硬件平台上配置RobotFramework的开发和运行环境。 树莓派上配置了自动化测试软件&#xff0c;可以考虑用多个这个廉价的“计算机”&#xff0c;开展并行的测试用例执行。成倍…

每日分享(免登录积分商城系统 动力商城 兑换商城源码)

​demo软件园每日更新资源,请看到最后就能获取你想要的: 1.Python教程2022&#xff1a;100天从新手到大师 完整版 Python 100天从新手到大师是一个Python入门教程&#xff0c;Python从入门到精通&#xff0c;专门为热爱python的新手量身定做的学习计划&#xff0c;100天速成pyt…