Vue-router 3.x 版本中路由守卫钩子函数解析

news2024/11/18 23:36:30

目录

  • 概念:
  • 分类
    • 全局前置守卫 ( router.beforeEach )
    • 全局解析守卫 ( router.beforeResolve )
    • 全局后置守卫 ( router.afterEach )
    • 路由独享守卫 ( beforeEnter )
    • 组件内的守卫
      • beforeRouteEnter
      • beforeRouteUpdate
      • beforeRouteLeave
  • 完整的导航解析流程


概念:

什么是路由守卫:正如其名,vue-router 提供的导航守卫主要用来通过跳转或取消的方式守卫导航。有多种机会植入路由导航过程中:全局的, 单个路由独享的, 或者组件级的。进行一个权限的把控

分类

全局前置守卫
全局解析守卫
全局后置守卫
————————
路由独享守卫
组件内的守卫

全局前置守卫 ( router.beforeEach )

    router.beforeEach((to, from, next) => {
        if (from.name === null && to.name != null) {
            next()
        } else if (to.name === null && from.name === null) {
            next({ name: 'bemissing' })
        } else if (to.name === 'loginhome' || to.name === 'bemissing') {
            next()
            return
        } else {
            let usersttate = JSON.parse(sessionStorage.getItem("userId"));
            if (usersttate) {
                next()
            } else {
                next({ name: 'loginhome' });
                vm.$message({
                    message: '登录已失效,请重新登录',
                    type: 'warning'
                });
            }
        }
    })

在这里插入图片描述

全局解析守卫 ( router.beforeResolve )

    router.beforeResolve((to , from , next) => {
        console.log("全局解析守卫",to, from);
        next()
    })

概念 :你可以用 router.beforeResolve 注册一个全局守卫。这和 router.beforeEach 类似,因为它在 每次导航时都会触发,但是确保在导航被确认之前,同时在所有组件内守卫和异步路由组件被解析之后,解析守卫就被正确调用。这里有一个例子,确保用户可以访问自定义 meta 属性

全局后置守卫 ( router.afterEach )

注意然而和全局前置守卫不同的是,这些钩子不会接受 next 函数也不会改变导航本

router.afterEach((to, from) => {
  // ...
})

路由独享守卫 ( beforeEnter )

顾名思义,路由独享守卫,是针对于某一个路由单元开启的 单独守卫验证!,独享守卫只有前置 ,没有后置,参数和 全局前置守卫 是一样的。

const router = new VueRouter({
  routes: [
    {
      path: '/foo',
      component: Foo,
      beforeEnter: (to, from, next) => {
        // ...
      }
    }
  ]
})

组件内的守卫

描述:组件内的守卫,就是同生命周期函数一样,定义在 组件中的,在相应的时期调用。

const Foo = {
  template: `...`,
  beforeRouteEnter(to, from, next) {
    // 在渲染该组件的对应路由被 confirm 前调用
    // 不!能!获取组件实例 `this`
    // 因为当守卫执行前,组件实例还没被创建
  },
  beforeRouteUpdate(to, from, next) {
    // 在当前路由改变,但是该组件被复用时调用
    // 举例来说,对于一个带有动态参数的路径 /foo/:id,在 /foo/1 和 /foo/2 之间跳转的时候,
    // 由于会渲染同样的 Foo 组件,因此组件实例会被复用。而这个钩子就会在这个情况下被调用。
    // 可以访问组件实例 `this`
  },
  beforeRouteLeave(to, from, next) {
    // 导航离开该组件的对应路由时调用
    // 可以访问组件实例 `this`
  }
}

beforeRouteEnter

描述: 进入页面的时候调用, beforeRouteEnter 守卫不能访问 this,因为守卫在导航确认前被调用,因此即将登场的新组件还没被创建。不过,你可以通过传一个回调给 next来访问组件实例。在导航被确认的时候执行回调,并且把组件实例作为回调方法的参数。

beforeRouteEnter (to, from, next) {
  next(vm => {
    // 通过 `vm` 访问组件实例
  })
}

beforeRouteUpdate

描述:beforeRouteEnter 路由更新时调用, 是支持给 next 传递回调的唯一守卫。对于 beforeRouteUpdate 和 beforeRouteLeave 来说,this 已经可用了,所以不支持传递回调,因为没有必要了。

beforeRouteUpdate (to, from, next) {
  // just use `this`
  this.name = to.params.name
  next()
}

beforeRouteLeave

描述: 离开当前路由页面的时候调用。 这个离开守卫通常用来禁止用户在还未保存修改前突然离开。该导航可以通过 next(false) 来取消。

beforeRouteLeave (to, from, next) {
  const answer = window.confirm('Do you really want to leave? you have unsaved changes!')
  if (answer) {
    next()
  } else {
    next(false)
  }
}

完整的导航解析流程

1. 导航被触发。
2. 在失活的组件里调用 beforeRouteLeave 守卫。
3. 调用全局的 beforeEach 守卫。
4. 在重用的组件里调用 beforeRouteUpdate 守卫 (2.2+)。
5. 在路由配置里调用 beforeEnter。
6. 解析异步路由组件。
7. 在被激活的组件里调用 beforeRouteEnter。
8. 调用全局的 beforeResolve 守卫 (2.5+)。
9. 导航被确认。
10. 调用全局的 afterEach 钩子
11. 触发 DOM 更新。
12. 调用 beforeRouteEnter 守卫中传给 next 的回调函数,创建好的组件实例会作为回调函数的参数传入。

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

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

相关文章

有哪些办法可以降低 Redis 的内存使用情况

在逛知乎时,看到这样一个问题,觉得挺不错的,将自己个人的见解分享给大家。问题是:有哪些办法可以降低 Redis 的内存使用情况?个人也对Redis做了一个比较全面的问题汇总,希望对大家有所帮助。Redis面试题汇总要降低内存…

Git同时配置Github和Gitlab

电脑的git需要同时管理Github上自己的代码仓库和Gitlab的公司的代码仓库,所以记录同时配置两者的步骤。 第一步、清除已有的全局配置(我之前只有github的配置) git config --global --unset user.name git config --global --unset user.em…

【论文阅读总结】Mask R-CNN翻译总结

Mask R-CNN1.摘要Mask R-CNN相关介绍与优点2.引言3.文献综述3.1 R-CNN3.2 Instance Segmentation【实例分割】4. Mask R-CNN介绍4.1 Faster R-CNN(相关细节请看相关文章)4.2 Mask R-CNN4.3 Mask Representation【遮罩表示法】4.4 RoIAlign【感兴趣区域对齐】4.4.1 RoIPool【感兴…

软件测试面试问答

笔试 笔试的话我们需要揣测具体会考什么内容,我们可以通过招聘信息去了解该公司需要什么样的技能,以此来准备笔试。一般必考的内容会有编程,测试用例设计,工作流程,逻辑思维等内容,除此之外每个公司可能还会…

【设计模式】我终于读懂了模板方法模式。。。

🍎豆浆制作问题 编写制作豆浆的程序,说明如下: 1.制作豆浆的流程 选材—>添加配料—>浸泡—>放到豆浆机打碎 2)通过添加不同的配料,可以制作出不同口味的豆浆 3)选材、浸泡和放到豆浆机打碎这几个步骤对于制作每种口味的豆浆都是一样…

二、IA-32系列处理器 通用寄存器介绍

IA-32系列处理器 通用寄存器介绍 寄存器处理器内的特殊存储单元处理器内有多种不同用途的寄存器寄存器分别有各自的名称,以便表示及访问通用寄存器IA-32系列CPU有8个32位的通用寄存器(General-Purpose Registers)通用寄存器不仅能存储数据,而且能参与算术逻辑运算,还能给出…

OpenCV 图像轮廓检测

本文是OpenCV图像视觉入门之路的第15篇文章,本文详细的介绍了图像轮廓检测的各种操作,例如:轮廓检索模式、轮廓逼近算子等操作。 图像轮廓是具有相同颜色或灰度的连续点的曲线,轮廓在形状分析和物体的检测和识别中很有用。图像轮廓…

预训练BERT

与PTB数据集相比,WikiText-2数据集保留了原来的标点符号、大小写和数字,并且比PTB数据集大了两倍多。 我们可以任意访问从WikiText-2语料库中的一对句子生成的预训练(遮蔽语言模型和下一句预测)样本。 原始的BERT有两个版本&…

《Python机器学习》基础代码

1,要学习Python机器学习,第一步就是读入数据,这里我们以读入excel的数据为例,利用jupyter notebook来编码,具体教程看这个视频 推荐先上传到jupyter notebook,再用名字.xlsx来导入 Jupyter notebook导入Excel数据的两种方法介绍_哔哩哔哩_bilibili 2,…

MyBatis - 06 - MyBatis获取参数值的两种方式(重要)

文章目录1、回顾JDBC原生的获取参数值的方式2、MyBatis获取参数值的两种方式3、MyBatis获取参数值的五种情况情况1: Mapper接口方法的参数为单个字面量类型的参数ParameterMapper接口代码测试类代码ParameterMapper.xml配置方式1:${}ParameterMapper.xml配置方式2:#…

[8]云计算概念、技术与架构Thomas Erl-第九章 云管理机制|week9|10月29日

9.0引言 基于云的IT资源需要被建立、配置、维护和监控。 远程管理系统 资源管理系统 SLA管理系统 计费管理系统 这些系统通常会提供整合的API,并能够以个别产品、定制应用或者各种组合产品套装和多功能应用的形式提供给用户。 9.1 远程管理系统 远程管理系统…

「回顾RKDC2023」飞凌嵌入式受邀亮相第七届瑞芯微开发者大会

2023年2月23-24日,第七届瑞芯微开发者大会(RKDC2023)在福州隆重举行,飞凌嵌入式作为瑞芯微生态合作伙伴受邀参会,并与数千名开发者科技公司代表及行业领袖共同聚焦行业新兴产品需求,探讨新硬件发展趋势&…

webpack实战,手写loader和plugin

序言 对于 webpack 来说, loader 和 plugin 可以算是需求程度最为广泛的配置项了。但是呢,单单止步于配置可能还不够。如果我们自己有时候想要 diy 一个需求,但是 webpack 又没有相关的 loader 和 plugin 。那这个时候我们可能就得开始造点轮…

【JAVA程序设计】(C00105)基于SSM大学在校生职业走向调查分析系统-有文档

基于SSM大学在校生职业走向调查分析系统-有文档项目简介项目获取开发环境项目技术运行截图项目简介 基于ssm框架大学生在校生职业走向调查分析系统分为二个角色:系统管理员、用户 管理员角色包含以下功能: 调查课题管理、留言信息管理、在校学生管理、社…

华为OD机试题,用 Java 解【最小步骤数】问题

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

JavaSE-3 Java运行原理

一、Java的运行过程 🍎Java程序运行时,必须经过编译和运行两个步骤。 首先将后缀名为.java的源文件进行编译,最终生成后缀名为.class的字节码文件。然后Java虚拟机将字节码文件进行解释执行,并将结果显示出来。具体过程如下图所示。 🍉Java程序的运行过…

Java集合学习:LinkedList源码详解

前言 LinkedList在我们平时工作中使用频率非车高,底层是基于双向链表数据结构实现,下面从经常使用的几个方法来了解其原理。 正文 结构 我们先看下LinkedList的重要属性 /**存储链表数量*/transient int size 0;/**存储链表的头节点*/transient Node…

MTK平台使用Omnipeek分析空口协议讲解

讲解这个之前,我们先来了解下beacon/robe Request/Probe Response 三种帧 beacon帧 信标帧,由AP以一定的时间间隔周期性发出,以此来告诉外界自己无线网络的存在。 Beacon帧作为802.11中一个周期性的帧,Beacon周期调高,对应睡眠周期拉长,故节能(即越来休息100ms再起来…

Laravel框架04:视图与CSRF攻击

Laravel框架04:视图与CSRF攻击一、视图概述二、变量分配与展示三、模板中直接使用函数四、循环与分支语法标签五、模板继承、包含1. 继承2. 包含六、外部静态文件引入七、CSRF攻击概述八、从CSRF验证中排除例外路由一、视图概述 视图存放在 resources/views 目录下…

Verilog 学习第五节(串口接收部分)

小梅哥串口部分学习part2 串口通信接收原理串口通信接收程序设计与调试巧用位操作优化串口接收逻辑设计串口接收模块的项目应用案例串口通信接收原理 在采样的时候没有必要一直判断一个clk内全部都是高/低电平,如果采用直接对中间点进行判断的话,很有可能…