当前位置: 首页 > 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 曾经是…...

2023年微信小程序获取手机号授权登录注册详细教程,包含服务端教程

前言 小程序中有很多地方都会用到用户的手机号&#xff0c;比如登陆注册&#xff0c;填写收货地址等等。有了这个组件可以快速获取微信绑定手机号码&#xff0c;无须用户填写。网上大多数教程还是往年的&#xff0c;而微信官方的api已做了修改。本篇文章将使用最新的方法获取手…...

YOLOv8模型学习笔记

在前面的章节中博主学习了YOLOv5的相关知识&#xff0c;从YOLOv5的数据增强处理到模型设计&#xff0c;从正负样本匹配策略到LOSS设计&#xff0c;今天博主学习的是YOLOv8&#xff0c;同为ultralytics公司的产品&#xff0c;两者无论是思想层面还是具体的设计方面都有着异曲同工…...

Java SE知识点1

一、continue、break、和return的区别是什么? 在循环结构中,当循环条件不满足或者循环次数达到要求时,循环会正常结束。但是,有时候可能需要 在循环的过程中,当发生了某种条件之后 ,提前终止循环,这就需要用到下面几个关键词: 1. continue :指跳出当前的这一次循环,…...

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

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

C++ Primer Plus 第6版 读书笔记(3) 第3章 处理数据

目录 3.1 简单变量 3.1.1 变量名 *位与字节 3.1.4 无符号类型 3.1.7 C如何确定常量的类型 C是在 C 语言基础上开发的一种集面向对象编程、泛型编程和过程化编程于一体的编程语言&#xff0c;是C语言的超集。本书是根据2003年的ISO/ANSI C标准编写的&#xff0c;通过大量短…...

ArrayList源码解读

参数 //默认初始容量private static final int DEFAULT_CAPACITY 10;//空数组(用于空实例)private static final Object[] EMPTY_ELEMENTDATA {};//用于默认大小空实例的共享空数组private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA {};//保存数据的数组tra…...

python实战应用讲解-【语法高级篇】时间与日期(附python示例代码)

目录 保持时间、计划任务和启动程序 time 模块 time.time() 函数 time.sleep() 函数 Python3 日期和时间...

D. Moscow Gorillas(双指针 + 区间分析)

Problem - D - Codeforces 在冬天&#xff0c;莫斯科动物园的居民非常无聊&#xff0c;尤其是大猩猩。你决定娱乐他们&#xff0c;带了一个长度为n的排列p到动物园。长度为n的排列是由n个从1到n的不同整数以任意顺序组成的数组。例如&#xff0c;[2,3,1,5,4]是一个排列&#xf…...

华为OD机试题,用 Java 解【相同数字的积木游戏 1】问题

最近更新的博客 华为OD机试题,用 Java 解【停车场车辆统计】问题华为OD机试题,用 Java 解【字符串变换最小字符串】问题华为OD机试题,用 Java 解【计算最大乘积】问题华为OD机试题,用 Java 解【DNA 序列】问题华为OD机试 - 组成最大数(Java) | 机试题算法思路 【2023】使…...

Python实现GWO智能灰狼优化算法优化BP神经网络分类模型(BP神经网络分类算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。1.项目背景灰狼优化算法(GWO)&#xff0c;由澳大利亚格里菲斯大学学者 Mirjalili 等人于2014年提出来的一种群智能优…...

上海网站开发/seo薪酬水平

---------------------------------------------------------------------1. 当前系统日期、时间select getdate() 2. dateadd 在向指定日期加上一段时间的基础上&#xff0c;返回新的 datetime 值例如&#xff1a;向日期加上2天select dateadd(day,2,2004-10-15) --返回&#…...

电子商务网站建设教程/百度搜索排行seo

python续行符号及替换续行符符号 续行符号&#xff1a;“\” 代码示例 if signal"red" and\ car"moving":#上面代码相当于&#xff1a; if signal"red" and car"moving":不需要续行符&#xff1a; 第一种&#xff1a;小括号&#xf…...

react可以做门户网站么/网站收录排名

var str $.trim(str);...

机票网站开发知乎/免费数据统计网站

项目中需要对地址进行解析&#xff0c;然后补齐省市区&#xff0c;下面这篇博客有很好的参考意义&#xff0c;减少了很多工作量&#xff0c;那个正则用的很巧妙。 地址解析步骤如下&#xff1a; 1、检查是否存在省份 2、如果存在省份&#xff0c;将会检查省份是否明确标注省&am…...

佛山网站建设推广/媒体宣传推广方案

大学一毕业进入职场&#xff0c;职场跟学校是不一样的&#xff0c;你不去问问题什么的&#xff0c;或者请教别人也不会告诉你&#xff0c;问多了别人还会烦躁&#xff0c;甚至还会觉得你没有能力&#xff0c;但是别人告诉你也是留一手&#xff0c;怕你学会抢他饭碗。牵引力教育…...

如何自己做个简单网站/长沙今日头条新闻

K-means也是聚类算法中最简单的一种了&#xff0c;但是里面包含的思想却是不一般。最早我使用并实现这个算法是在学习韩爷爷那本数据挖掘的书中&#xff0c;那本书比较注重应用。看了Andrew Ng的这个讲义后才有些明白K-means后面包含的EM思想。 聚类属于无监督学习&#xff0c;…...