当前位置: 首页 > news >正文

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

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>

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

相关文章:

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

&#x1f973;博 主&#xff1a;初映CY的前说(前端领域) &#x1f31e;个人信条&#xff1a;想要变成得到&#xff0c;中间还有做到&#xff01; &#x1f918;本文核心&#xff1a;当我们在路由跳转前与后我们可实现触发的操作 【前言】当我们在做类似于登录页面的时候&…...

Google Guice 5:AOP

1. AOP 1.1 实际开发中面临的问题 在实际开发中&#xff0c;经常需要打印一个方法的执行时间&#xff0c;以确定是否存在慢操作 最简单的方法&#xff0c;直接修改已有的方法&#xff0c;在finnally语句中打印耗时 Override public Optional<Table> getTable(String da…...

【同步、共享和内容协作软件】上海道宁与​ownCloud让您的团队随时随地在任何设备上轻松处理数据

ownCloud是 一款开源文件同步、共享和 内容协作软件 可让团队随时随地 在任何设备上轻松处理数据 ownCloud开发并提供 用于内容协作的开源软件 使团队能够轻松地无缝 共享和处理文件 而无需考虑设备或位置 开发商介绍 ownCloud成立于2010年&#xff0c;是一个托管和同…...

Linux 文件、目录与磁盘格式

用户与用户组 用户&#xff1a;即某个文件的拥有者&#xff0c;可以管理自己账号下的文件&#xff0c;另有一个超级账号 root&#xff0c;可以统一管理全局&#xff0c;利用 su root 命令登录该账号。用户组&#xff1a;相当于群组&#xff0c;多个用户之间可以组成用户组&…...

锁屏面试题百日百刷-Hive篇(五)

锁屏面试题百日百刷&#xff0c;每个工作日坚持更新面试题。锁屏面试题app、小程序现已上线&#xff0c;官网地址&#xff1a;https://www.demosoftware.cn。已收录了每日更新的面试题的所有内容&#xff0c;还包含特色的解锁屏幕复习面试题、每日编程题目邮件推送等功能。让你…...

java多线程(七)线程等待与唤醒

一、wait()、notify()、notifyAll()等方法介绍 在Object.java中&#xff0c;定义了wait(), notify()和notifyAll()等接口。wait()的作用是让当前线程进入等待状态&#xff0c;同时&#xff0c;wait()也会让当前线程释放它所持有的锁。而notify()和notifyAll()的作用&#xff0…...

第13天-仓储服务(仓库管理,采购管理 ,SPU规格维护)

1.仓储服务开发配置 1.1.加入到Nacos注册中心 spring:application:name: gmall-warecloud:nacos:discovery:server-addr: 192.168.139.10:8848namespace: 36854647-e68c-409b-9233-708a2d41702c1.2.配置网关路由 spring:cloud:gateway:routes:- id: ware_routeuri: lb://gmal…...

Maven 命令行及例子

基本 mvn -v - show-version -version 显示版本信息mvn -h - help 显示帮助信息mvn -e -errors控制 maven 的日志级别&#xff0c;产生执行错误相关消息mvn -q - quiet 控制 maven 的日志级别&#xff0c;仅仅显示错误mvn -o - offline 运行 offline 模式&#xff0c;不联网更…...

JavaScript手写题

一、防抖 function debounce(fn, delay200) {let timeout null; // 定时器控制return function(...args) {if (timeout) { // 定时器存在&#xff0c;表示某个动作之前触发过了clearTimeout(timeout); // 清除定时器timeout null;} else {// 对第一次输入立即执行fn.apply…...

为什么图标的宽度总是8的倍数?

对于 Windows 上的所有图标而言&#xff0c;它的宽度总是8的倍数&#xff0c;这可不是因为人们喜欢2的幂&#xff0c;虽然在计算机世界&#xff0c;你会看到很多这样的数字&#xff0c;例如&#xff0c;1024&#xff0c;4096等。 在 Windows 的早期阶段&#xff0c;大多数显卡…...

常用的xpath

一、xpath 语法 简单看一下菜鸟教程即可 1、基本语法 XPath 使用路径表达式在 XML 文档中选取节点。节点是通过沿着路径或者 step 来选取的。 下面列出了最有用的路径表达式&#xff1a; 表达式描述nodename选取此节点的所有子节点。/从根节点选取&#xff08;取子节点&#…...

【035】基于java的进销库存管理系统(Vue+Springboot+Mysql)前后端分离项目,附万字课设论文

1.3 系统实现的功能 本次设计任务是要设计一个超市进销存系统&#xff0c;通过这个系统能够满足超市进销存系统的管理及员工的超市进销存管理功能。系统的主要功能包括&#xff1a;首页、个人中心、员工管理、客户管理、供应商管理、承运商管理、仓库信息管理、商品类别管理、 …...

【Spark分布式内存计算框架——Spark Streaming】7. Kafka集成方式

集成方式 Spark Streaming与Kafka集成&#xff0c;有两套API&#xff0c;原因在于Kafka Consumer API有两套&#xff0c; 文档&#xff1a;http://spark.apache.org/docs/2.4.5/streaming-kafka-integration.html。 方式一&#xff1a;Kafka 0.8.x版本 老的Old Kafka Consum…...

如何引入elementUI

elementUI的引入完整引入按需引入完整引入 在 main.js 中写入以下内容&#xff1a; import Vue from ‘vue’; import ElementUI from ‘element-ui’; import ‘element-ui/lib/theme-chalk/index.css’; import App from ‘./App.vue’; Vue.use(ElementUI); new Vue({ el: ‘…...

vue3+rust个人博客建站日记4-Vditor搞定MarkDown

即然是个人博客&#xff0c;那么绝对不能丢给自己一个大大的输入框敷衍了事。如果真是这样&#xff0c;现在就可以宣布项目到此结束了。如今没人享受用输入框写博客。作为一个有追求的程序员&#xff0c;作品就要紧跟潮流。 后来&#xff0c;Markdown 的崛起逐步改变了大家的排…...

KDZD-JC软化击穿试验仪

一、概 述 KDZD-JC智能软化击穿试验仪是根据GB/T4074.6-2008和idtIEC60851-6:2004标准而设计的一种新型漆包圆线检测仪器。主要适用于固体绝缘材料&#xff08;如&#xff1a;塑料、橡胶、层压材料、薄膜、树脂、云母、陶瓷、玻璃、绝缘漆等绝缘材料及绝缘件&#xff09;在工…...

【数据结构】单链表的C语言实现--万字详解介绍

​ ​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;数据结构 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录1.链表1.1 链表的概念…...

电子科技大学软件工程期末复习笔记(七):测试策略

目录 前言 重点一览 V模型 回归测试 单元测试 集成测试 重要概念 自顶向下的集成方法 自底向上的集成方法 SMOKE方法 系统测试 验收测试 α测试 β测试 本章小结 前言 本复习笔记基于王玉林老师的课堂PPT与复习大纲&#xff0c;供自己期末复习与学弟学妹参考用…...

逆向-还原代码之除法 (Interl 64)

除法和32位差不多&#xff0c;毕竟背后的数学公式是一样的。区别只是32位的乘法需要两个寄存器来存放大数相乘的结果&#xff0c;而64位的不需要&#xff0c;一个寄存器就能存下。所以在64位的环境下&#xff0c;多了右移32位这条指令&#xff0c;其他指令一样。 //code #incl…...

Python WebDriver自动化测试

Webdriver Selenium 是 ThroughtWorks 一个强大的基于浏览器的开源自动化测试工具&#xff0c;它通常用来编写 Web 应用的自动化测试。 Selenium 2&#xff0c;又名 WebDriver&#xff0c;它的主要新功能是集成了 Selenium 1.0 以及 WebDriver​&#xff08;WebDriver 曾经是…...

Python|GIF 解析与构建(5):手搓截屏和帧率控制

目录 Python&#xff5c;GIF 解析与构建&#xff08;5&#xff09;&#xff1a;手搓截屏和帧率控制 一、引言 二、技术实现&#xff1a;手搓截屏模块 2.1 核心原理 2.2 代码解析&#xff1a;ScreenshotData类 2.2.1 截图函数&#xff1a;capture_screen 三、技术实现&…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别

一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

九天毕昇深度学习平台 | 如何安装库?

pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子&#xff1a; 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...

HDFS分布式存储 zookeeper

hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架&#xff0c;允许使用简单的变成模型跨计算机对大型集群进行分布式处理&#xff08;1.海量的数据存储 2.海量数据的计算&#xff09;Hadoop核心组件 hdfs&#xff08;分布式文件存储系统&#xff09;&a…...

Mysql中select查询语句的执行过程

目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析&#xff08;Parser&#xff09; 2.4、执行sql 1. 预处理&#xff08;Preprocessor&#xff09; 2. 查询优化器&#xff08;Optimizer&#xff09; 3. 执行器…...

【Go语言基础【12】】指针:声明、取地址、解引用

文章目录 零、概述&#xff1a;指针 vs. 引用&#xff08;类比其他语言&#xff09;一、指针基础概念二、指针声明与初始化三、指针操作符1. &&#xff1a;取地址&#xff08;拿到内存地址&#xff09;2. *&#xff1a;解引用&#xff08;拿到值&#xff09; 四、空指针&am…...

【Linux】Linux 系统默认的目录及作用说明

博主介绍&#xff1a;✌全网粉丝23W&#xff0c;CSDN博客专家、Java领域优质创作者&#xff0c;掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围&#xff1a;SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...

打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用

一、方案背景​ 在现代生产与生活场景中&#xff0c;如工厂高危作业区、医院手术室、公共场景等&#xff0c;人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式&#xff0c;存在效率低、覆盖面不足、判断主观性强等问题&#xff0c;难以满足对人员打手机行为精…...

Git常用命令完全指南:从入门到精通

Git常用命令完全指南&#xff1a;从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...