Vue3-39-路由-导航异常的检测 afterEatch 与 编程式导航之后的订阅动作

news2025/1/12 3:07:01

说明

本文主要是介绍一下 路由的后置守卫 afterEatch 的一个重要的作用 : 就是检测路由异常信息。
它的实现方式是 通过第三个参数来返回的。
而且,它的异常检测是全局的。

导航的异常有以下三种类型:
aborted : 在导航守卫中 被拦截并返回了false;
cancelled : 在导航完成之前又产生了一次新的导航;
duplicated : 导航被阻止,已经在目标位置了。
下面通过案例来认识一下这三种异常。

补充1

vue-router 中提供了 关于路由导航异常的检测API
isNavigationFailure() : 判断路由是否是某种异常
NavigationFailureType : 包含了上述三种异常状态的枚举。

补充2

我们在代码中通过 编程式导航push 方法进行路由时,
都会返回一个 Promise对象,
我们可以正常的订阅这个 Promise 对象,从而实现 在路由结束之后做一些逻辑处理。

aborted

在导航守卫中 被拦截并返回了false。
(1)在前置守卫中拦截 /b;
(2)在后置守卫中检测到 aborted 异常信息。

路由配置如下

// 导入 定义路由的两个方法
import {createRouter,createWebHistory}  from 'vue-router'

// 懒加载写法: 先声明,下面直接使用
const componentA = () => import('./componentA.vue')
const componentB = () => import('./componentB.vue')

// 声明路由跳转的路径与组件的对应关系
const routsList = [
    // 直接使用上面声明的组件
    {path:'/a',name:'aroute',component:componentA},
    {path:'/b',name:'broute',component:componentB}
]

// 创建路由的实例对象
const routerConfigObj = createRouter({
    history:createWebHistory('abc'), // 带一个参数,表示是路由的一个前缀
    routes:routsList // 指定路由的配置列表
})


// 前置守卫
routerConfigObj.beforeEach((to,from)=>{
    console.log('前置守卫 : to  : ',to)
    console.log('前置守卫 :from : ',from)
    

    // 当路由地址是 /b 时 , 手动停止跳转,模拟跳转中止的情况
    if(to.path == '/b'){
        console.log('前置守卫 : 是 /b 路由,拦截它')
        console.log('------')
        // 直接返回 false 
        return false; // aborted

    }
    return true
})


// 后置守卫
routerConfigObj.afterEach((to,from,failureObj) => {
    console.log('后置守卫 : to  : ',to)
    console.log('后置守卫 :from : ',from)
    console.log('后置守卫 :failureObj : ',failureObj)
    console.log('------')
})


// 导出路由的对象
export default routerConfigObj;

运行结果:

在这里插入图片描述

cancelled

在导航守卫中 被拦截 并且 重新导航到一个新的路由上去。

路由配置如下:

// 导入 定义路由的两个方法
import {createRouter,createWebHistory}  from 'vue-router'

// 懒加载写法 : 先声明,下面直接使用
const componentA = () => import('./componentA.vue')
const componentB = () => import('./componentB.vue')

// 声明路由跳转的路径与组件的对应关系
const routsList = [
    // 直接使用上面声明的组件
    {path:'/a',name:'aroute',component:componentA},
    {path:'/b',name:'broute',component:componentB}
]

// 创建路由的实例对象
const routerConfigObj = createRouter({
    history:createWebHistory('abc'), // 带一个参数,表示是路由的一个前缀
    routes:routsList // 指定路由的配置列表
})


// 前置守卫
routerConfigObj.beforeEach((to,from)=>{
    console.log('前置守卫 : to  : ',to)
    console.log('前置守卫 :from : ',from)
    

    // 当路由地址是 /b 时 , 手动停止跳转,模拟跳转中止的情况
    if(to.path == '/b'){
        console.log('前置守卫 : 是 /b 路由,拦截它,重新push到 /a 这个路由上去')
        console.log('------')
        // push 到新的路由中去
        routerConfigObj.push('/a') // cancelled

    }
    
    return true
})

// 后置守卫
routerConfigObj.afterEach((to,from,failureObj) => {
    console.log('后置守卫 : to  : ',to)
    console.log('后置守卫 :from : ',from)
    console.log('后置守卫 :failureObj : ',failureObj)
    console.log('------')
})


// 导出路由的对象
export default routerConfigObj;

运行结果

在这里插入图片描述

duplicated

路由重复跳转时会触发的异常。
例如 : 当前我们已经在 /a 上面了,点击按钮,又想跳转到 /a 上面,此时就会触发这个异常。

本案例就使用到了 补充1补充2 中的知识点了。

路由配置

// 导入 定义路由的两个方法
import {createRouter,createWebHistory}  from 'vue-router'

// 懒加载写法 : 先声明,下面直接使用
const componentA = () => import('./componentA.vue')

// 声明路由跳转的路径与组件的对应关系
const routsList = [
    // 直接使用上面声明的组件
    {path:'/a',name:'aroute',component:componentA}
]

// 创建路由的实例对象
const routerConfigObj = createRouter({
    history:createWebHistory('abc'), // 带一个参数,表示是路由的一个前缀
    routes:routsList // 指定路由的配置列表
})


// 前置守卫
routerConfigObj.beforeEach((to,from)=>{
    console.log('前置守卫 : to  : ',to)
    console.log('前置守卫 :from : ',from)
    console.log('------')
})

// 后置守卫
routerConfigObj.afterEach((to,from,failureObj) => {
    console.log('后置守卫 : to  : ',to)
    console.log('后置守卫 :from : ',from)
    console.log('后置守卫 :failureObj : ',failureObj)
    console.log('------')
})

// 导出路由的对象
export default routerConfigObj;

组件A 中的操作 : 有一个按钮,点击按钮,仍然跳转到当前的路由上

<template>
    <div class="diva">
        这是组件A
        <br>
        <button @click="goToA">跳转到组件A</button>
    </div>
    
</template>

<script setup lang="ts">

    // 引入两个路由相关的方法
    import { useRouter,useRoute} from 'vue-router';

    // 声明 路由实例对象 和 当前路由对象
    const routerObj = useRouter()
    const currentRoute = useRoute()

    // 打印一下路由实例对象 和 当前路由对象
    console.log('A 组件 中 路由实例对象 :',routerObj)
    console.log('A 组件 中 当前路由对象 :',currentRoute)

	// 导入 路由异常 相关的API 
    import { isNavigationFailure,NavigationFailureType} from 'vue-router';

    // 跳转到自己
    const goToA = () =>{
        routerObj.push('/a')
        .then((failure:any) => {
            console.log('push 中的错误返回结果 :', failure)
            if(isNavigationFailure(failure,NavigationFailureType.duplicated)){
                console.log('路由重复了')
            }else{
                console.log('路由没有重复')
            }
        })
    }

</script>

<style scoped>
    .diva{
        width: 300px;
        height: 200px;
        background: red;
    }
</style>

运行结果

在这里插入图片描述

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

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

相关文章

深入Pandas(二):高级数据处理技巧

文章目录 系列文章目录引言时间序列分析可视化示例 高级数据分析技术分组与聚合操作时间序列分析 高级数据操作数据合并与重塑示例&#xff1a;数据合并merge示例&#xff1a;数据合并concat示例&#xff1a;数据重塑 - 透视表 高级索引技巧 结论 系列文章目录 Python数据分析…

B059-权限管理系统01

目录 知识点介绍项目演示项目搭建动态菜单查询分析(权限表分析)权限系统表分析角色模块pageInfopageHelper实现前端动态分页高级查询新增与修改删除角色 分配权限-表分析角色授权数据-一级和二级权限查询 知识点介绍 项目演示 准备数据库 准备工程auth_new tips&#xff1a;…

Java中请求生成唯一追溯TraceId

Java中请求生成唯一追溯TraceId 一&#xff1a;背景 因为是微服务架构,平常日志太多,看日志不太好查,所以想要从一整个链路当中获取一个唯一标识,比较好定位问题&#xff0c; 原理就是从gateway网关将标识传递到下游,下游服务拿到这个标识,响应结束后将traceId反向写入响应体…

Python中的有序字典是什么

有序字典 一、简介 Python中的字典的特性&#xff1a;无序性。 有序字典和通常字典类似&#xff0c;只是它可以记录元素插入其中的顺序&#xff0c;而一般字典是会以任意的顺序迭代的。 二、普通字典 #! /usr/bin/env python3 # -*- coding:utf-8 -*- d1 {} d1[a] A d1[b…

十种编程语言的对比分析

在当今的软件开发领域&#xff0c;编程语言扮演着至关重要的角色。不同的编程语言各有其特点和适用场景&#xff0c;选择合适的编程语言能够提高开发效率和软件质量。本文将对十种常见的编程语言进行对比分析&#xff0c;帮助读者了解它们的优缺点和适用场景。 一、Python Pyt…

微服务实战系列之API加密

前言 随着一阵阵凛冽寒风的呼啸&#xff0c;新的年轮不知不觉滚滚而来。故事随着2023的远去&#xff0c;尘封于案底&#xff1b;希望迎着新年&#xff0c;绽放于枝头。在2024新岁启航&#xff0c;扬帆破浪之时&#xff0c;让烦恼抛洒于九霄&#xff0c;让生机蓬勃于朝朝暮暮。 …

Java 将Excel转换为TXT文本格式

TXT文件是一种非常简单、通用且易于处理的文本格式。在处理大规模数据时&#xff0c;将Excel转为TXT纯文本文件可以提高处理效率。此外&#xff0c;许多编程语言和数据处理工具都有内置的函数和库来读取和处理TXT文件&#xff0c;因此将Excel文件转换为TXT还可以简化数据导入过…

继续理解Nacos的CP和AP架构模型!

本篇文章延续文章“如何理解Nacos册CP和AP架构模型”&#xff0c;大家可以配套一起学习。 Nacos注册中心处理HTTP注册请求 在文章“如何理解Nacos册CP和AP架构模型”中已经提到过&#xff0c;Nacos注册中心用Restful API InstanceController的方法register()处理HTTP类型的注…

瑞数4——MmEwMD逆向分析

瑞数4——MmEwMD逆向分析 提示简介定位入口MmEwMD生成所需参数分析MmEwMD生成的大致流程第一部分生成(所需三个参数)第一部分生成的值赋值给另一个变量第二部分生成并与第一部分拼接最终的结果与MmEwMD拼接 第一部分生成的逆向分析&#xff08;所需参数&#xff1a;数组a、数字…

Linux第17步_安装SSH服务

secure shell protocol简称SSH。 目的&#xff1a;在进行数据传输之前&#xff0c;SSH先对联级数据包通过加密技术进行加密处理&#xff0c;然后再进行数据传输&#xff0c;确保数据传输安全。 1、在安装前&#xff0c;要检查虚拟机可以上网&#xff0c;否则可能会导致安装失…

C++内容补充--面向对象篇

类和对象 类中静态成员不占用类的大小 也就不占用类的对象的大小 只有一个类壳子的时候 类和对象的大小都是1 当类中只有一个int数据的时候 类和对象的大小都是4 当类中有int数据以及一个静态变量的时候 类和对象的大小还是4 变量存储类以及对象的存储类 所有的局部变量默认…

Linux上传、下载、rz、sz命令

一、上传下载 我们可以通过finalshell工具方便地和虚拟机进行数据交换 在finalshell软件的下方窗体中&#xff0c;提供了Linux的文件系统视图 点击下载就可以下载了 如果想通过root权限&#xff0c;那么需要在编辑器中更换用户名&#xff1a; 上传&#xff1a;直接把windows…

C#,入门教程(08)——基本数据类型及使用的基础知识

上一篇&#xff1a; C#&#xff0c;入门教程(07)——软件项目的源文件与目录结构https://blog.csdn.net/beijinghorn/article/details/124139947 数据类型用于指定数据体&#xff08;DataEntity&#xff0c;包括但不限于类或结构体的属性、变量、常量、函数返回值&#xff09;…

架构的本质是什么?

最近总是有小伙伴问我&#xff0c;如何成长为一名优秀的架构师&#xff0c;我也不知道该如何去回答&#xff0c;但是我想聊一下架构的本质。 架构不是互联网行业独有的 架构及对应的架构师职位并不是互联网行业独有的&#xff0c;只要存在组织的地方就存在架构。 比如一个木…

企业出海数据合规:GDPR中的个人数据与非个人数据之区分

GDPR仅适用于个人数据&#xff0c;这意味着非个人数据不在其适用范围内。因此&#xff0c;个人数据的定义是一个至关重要的因素&#xff0c;因为它决定了处理数据的实体是否要遵守该法规对数据控制者规定的各种义务。尽管如此&#xff0c;什么是个人数据仍然是当前数据保护制度…

用通俗易懂的方式讲解:LSTM原理及生成藏头诗(Python)

一、基础介绍 1.1 神经网络模型 常见的神经网络模型结构有前馈神经网络(DNN)、RNN&#xff08;常用于文本 / 时间系列任务&#xff09;、CNN&#xff08;常用于图像任务&#xff09;等等。 前馈神经网络是神经网络模型中最为常见的&#xff0c;信息从输入层开始输入&#xf…

SpringBoot 调用mybatis报错:Invalid bound statement (not found):

启动SpringBoot报错&#xff1a;Invalid bound statement (not found): 参考此文排查 命中了第6条 记录一手坑爹的Invalid bound statement (not found)&#xff08;六个方面&#xff09; mapper文件路径配置错误 订正以后 问题解决

项目从npm迁移到pnpm

场景如下&#xff1a;在安装Vue3时默认为使用Npm安装&#xff0c;如图所示&#xff1a; 安装完后项目就包含了基于NPM的node_modules、package.json&#xff0c;以及package-lock.json 如果想使用pnpm去安装依赖项的话&#xff0c;可以通过如下几个步骤实现&#xff1a; ①删…

基于R语言(SEM)结构方程模型教程

详情点击链接&#xff1a;基于R语言&#xff08;SEM&#xff09;结构方程模型教程 01、R/Rstudio (2)R语言基本操作&#xff0c;包括向量、矩阵、数据框及数据列表等生成和数据提取等 (3)R语言数据文件读取、整理&#xff08;清洗&#xff09;、结果存储等&#xff08;含tidve…

JAVA中小型医院信息管理系统源码 医院系统源码

开发框架&#xff1a;SpringBootJpathymeleaf 搭建环境&#xff1a;jdk1.8idea/eclipsemaven3mysql5.6 基于SpringBoot的中小型医院信息管理系统&#xff0c;做的比较粗糙&#xff0c;但也实现了部分核心功能。 就诊卡提供了手动和读卡两种方式录入&#xff0c;其中IC读卡器使用…