Vue Router 路由生命周期钩子/路由导航守卫

文章目录

  • 简介
  • 一、全局钩子
  • 二、路由独享的钩子
  • 三、组件内的钩子
    • Vue 2 (Vue Router 3) 中
    • Vue 3 (Vue Router 4)中
  • 四、执行顺序
  • 五、错误处理
    • Vue Router 4(适用于 Vue 3)中
    • Vue Router 3(适用于 Vue 2)中

简介

Vue Router 提供了路由钩子(Route Hooks),允许你在路由发生变化时执行一些操作。
这些钩子可以在路由进入、离开等关键时刻触发,从而实现一些特定的功能,比如页面权限控制、数据预加载等。

路由守卫简单来讲就是监听页面进入修改,和离开的功能。

每个守卫接受三个参数:

  • to:即将要进入的路由对象
  • from:当前导航正要离开的路由
  • next:一定要调用该方法来 resolve 这个钩子。执行效果依赖 next 方法的调用参数。

关于 next :

  1. next():进行管道中的下一个钩子。如果全部钩子执行完了,则导航的状态就是 confirmed (确认的)。
  2. next(false):中断当前的导航。如果浏览器的 URL 改变了(可能是用户手动或浏览器后退按钮),那么 URL 地址会重置到 from 路由对应的地址。
  3. next('/')next({ path: '/' }):跳转到一个不同的地址。当前的导航被中断,然后进行一个新的导航。
  4. next(error):(2.4.0+) 如果传入 next 的参数是一个 Error 实例,则导航会被终止且该错误会被传递给 router.onError() 注册过的回调。

.

Vue Router 的路由钩子主要分为三类:

  • 全局钩子
  • 路由独享的钩子
  • 组件内的钩子

一、全局钩子

全局钩子对整个路由实例都有效,它们主要有两个:beforeEachafterEach

  • beforeEach:在路由跳转前触发,常用于判断用户是否登录、是否有权限访问某个页面等。

  • beforeResolve:在路由解析完成后被调用,即在确认要导航的路由与当前的路由不同之后,但在实际的组件渲染之前。这个守卫非常适合用于在导航到新的路由之前预先获取数据或执行其他逻辑,特别是当这些数据需要在组件渲染之前就已经准备好的时候。

  • afterEach:在路由跳转后触发,通常用于一些清理工作或者页面跳转后的通知。

const router = new VueRouter({ /* ... */ }); 
  
router.beforeEach((to, from, next) => {  
  // 逻辑判断...  
  next() // 确保要调用 next() 方法,否则路由不会跳转  
})  

router.beforeResolve((to, from, next) => {
    // 假设需要预先获取一些数据,比如用户的权限信息
	next(); // 确保调用 next() 来继续导航
});

router.afterEach((to, from) => {  
  // 路由跳转后的操作...  
})

二、路由独享的钩子

可以在路由配置中直接定义 beforeEnter 钩子,它只会在进入该路由时触发。

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

三、组件内的钩子

在 Vue 组件中,你可以使用以下路由钩子:beforeRouteEnterbeforeRouteUpdate(2.2+ 新增)、beforeRouteLeave

  • beforeRouteEnter:在路由进入该组件的渲染函数之前调用,此时组件实例尚未创建,因此无法访问 this。可以通过 next 的回调函数来访问组件实例。

  • beforeRouteUpdate:当同一个路由重新渲染时调用,例如,对于带有动态参数的路由 /foo/:id,当 :id 发生变化时,该组件会被重新渲染。

  • beforeRouteLeave:在导航离开该组件的对应路由时调用。

Vue 2 (Vue Router 3) 中

export default {  
  data() {  
    return {  
      // ...  
    }  
  },  
  beforeRouteEnter(to, from, next) {  
    // 组件尚未创建,无法访问 `this`  
    next(vm => {  
      // 访问组件实例 `vm`  
    })  
  },  
  beforeRouteUpdate(to, from, next) {  
    // 当前路由改变,但组件复用时调用  
    // 例如,对于带查询参数或动态段的路由 `/foo?a=1` 或者 `/foo/1`,  
    // 组件实例会被复用,此时这个钩子会被调用  
    this.someData = 'new data'  
    next()  
  },  
  beforeRouteLeave(to, from, next) {  
    // 导航离开该组件的对应路由时调用  
    // 可以访问组件实例 `this`  
    const answer = window.confirm('你确定要离开吗?')  
    if (answer) {  
      next()  
    } else {  
      next(false) // 取消导航  
    }  
  }  
}

Vue 3 (Vue Router 4)中

组件内钩子的使用方式在 Vue 3 中没有显著变化,但如果你使用 Composition API,你可能会更倾向于使用 onBeforeRouteEnteronBeforeRouteUpdateonBeforeRouteLeave 函数,这些函数可以与 setup 函数一起使用。

import { onBeforeRouteEnter, onBeforeRouteUpdate, onBeforeRouteLeave } from 'vue-router';  
  
export default {  
  setup() {  
    onBeforeRouteEnter((to, from, next) => {  
      next(vm => {  
        // 访问组件实例  
      });  
    });  
  
    onBeforeRouteUpdate((to, from, next) => {  
      // ...当前路由改变,但组件复用时调用  
      next();  
    });  
  
    onBeforeRouteLeave((to, from, next) => {  
      // ...导航离开该组件的对应路由时调用  
      next();  
    };  
  
    // ...其他 Composition API 逻辑  
  }  
};
vue-router 3.xvue-router 4.x
beforeRouteEnteronBeforeRouteEnter
beforeRouteUpdateonBeforeRouteUpdate
beforeRouteLeaveonBeforeRouteLeave

四、执行顺序

  1. 当导航开始时,首先触发全局的 beforeEach 钩子

  2. 如果 beforeEach 钩子中没有取消导航,则继续执行路由独享的 beforeEnter 钩子(如果有定义的话)。

  3. 在路由被确认(即解析完成)之后,但在组件渲染之前,会触发全局的 beforeResolve 钩子

  4. 如果导航继续,并且即将进入的组件有定义组件内的钩子,那么在组件实例创建之前会执行组件内beforeRouteEnter钩子

  5. 路由改变完成,组件渲染之后,触发全局的 afterEach 钩子

  6. 如果组件被复用,例如对于带有动态参数的路由,当参数发生变化时,该组件会被重新渲染。这时会触发组件内beforeRouteUpdate钩子

  7. 如果在导航过程中需要离开当前组件,那么会触发当前组件内的 beforeRouteLeave 钩子

即:

  1. 全局 beforeEach 钩子
  2. 路由独享 beforeEnter 钩子
  3. 全局 beforeResolve 钩子
  4. 组件内beforeRouteEnter钩子
  5. 全局 afterEach 钩子
  6. 组件内beforeRouteUpdate钩子
  7. 组件内的 beforeRouteLeave 钩子

1-5 进入的钩子
6 更新的钩子
7 离开的钩子


五、错误处理

Vue Router 4(适用于 Vue 3)中

可以使用 router.onError 方法来注册一个错误处理回调,用来检测和处理可能发生的错误。这个方法允许你定义一个函数,该函数会在路由导航过程中发生错误时被调用。

onError 并不是一个路由钩子(guard)或生命周期钩子,而是一个错误处理函数,可以注册到 Vue Router 实例上以便在路由导航过程中发生错误时进行处理。

以下是一个简单的示例,展示了如何在 Vue Router 4 中使用 onError 方法:

import { createRouter, createWebHistory } from 'vue-router';  
  
const router = createRouter({  
  history: createWebHistory(),  
  routes: [  
    // 路由配置...  
  ],  
});  
  
router.onError((error) => {  
  // 处理路由导航中发生的错误  
  console.error('路由导航发生错误:', error);  
});  
  
export default router;

.

Vue Router 3(适用于 Vue 2)中

在 Vue Router 3 或更早的版本中,没有直接的 onError 方法,但你可以通过全局的 afterEach 钩子来检测和处理可能发生的错误。

例如,如果某个路由守卫中调用了 next(error),可以在 afterEach 钩子中检测到这个错误并进行处理:

router.afterEach((to, from, failure) => {  
  if (failure) {  
    // 处理路由导航中发生的错误  
    console.error('路由导航发生错误:', failure);  
  }  
});

afterEach 钩子的第三个参数 failure 在 Vue Router 3.1.0 之后的版本中才被引入,用于传递导航失败时的错误信息。

总的来说,虽然 Vue Router 3 没有直接命名为 onError 的钩子,但可以通过上述方式在路由导航发生错误时进行捕获和处理。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

跟着Datawhale重学数据结构与算法

数据结构和算法之前学过,现在跟着Datawhale重学一下,就当是监督自己学习,重新拾起来养成一个好的习惯,以后可以一直坚持下去。 开源链接:【 教程地址 】【电子网站】 首先: #mermaid-svg-Cdr3rn9fGCVAiKS…

文献速递:深度学习胰腺癌诊断--胰腺癌在CT扫描中通过深度学习检测:一项全国性的基于人群的研究

Title 题目 Pancreatic Cancer Detection on CT Scans with Deep Learning: A Nationwide Population-based Study 胰腺癌在CT扫描中通过深度学习检测:一项全国性的基于人群的研究 01 文献速递介绍 胰腺癌(PC)的五年生存率是所有癌症中…

记一次奇妙的某个edu渗透测试

前话: 对登录方法的轻视造成一系列的漏洞出现,对接口确实鉴权造成大量的信息泄露。从小程序到web端网址的奇妙的测试就此开始。(文章厚码,请见谅) 1. 寻找到目标站点的小程序 进入登录发现只需要姓名加学工号就能成功…

什么是线程的上下文切换?

我们知道使用多线程的目的是为了充分利用多核CPU,比如说我们是16核,但是当创建很多线程比如说160个,CPU不够用了,此时就是一个CPU来应付多个线程(这里我们是一个CPU应对10个线程)。这个时候,操作…

【LeetCode每日一题】924. 尽量减少恶意软件的传播(并查集)

文章目录 [924. 尽量减少恶意软件的传播](https://leetcode.cn/problems/minimize-malware-spread/)思路:并查集代码: 924. 尽量减少恶意软件的传播 思路:并查集 构建并查集:首先,代码创建了一个 UnionFind 类来维护节…

HTML 入门

HTML 简介 1. 什么是 HTML? 全称:HyperText Markup Language(超文本标记语言)。 超文本:暂且简单理解为 “超级的文本”,和普通文本比,内容更丰富。 标 记:文本要变成超文本&…

单例模式五种写法

单例模式五种写法 单例模式有五种写法:饿汉、懒汉、双重检验锁、静态内部类、枚举. 单例模式属于设计模式中的创建型模式 一、单例模式应用场景 windows的task manager(任务管理器)就是很典型的单例模式; windows的recycle bin(回收站)也是典型的单例应用&#…

防范“AI换脸”风险 ZOLOZ Deeper月超2万次攻防测试

4 月 16 日,深度伪造(Deepfake)综合防控产品ZOLOZ Deeper 在北京正式发布,以拦截用户刷脸过程中的“AI换脸”风险,目前已率先应用在身份安全领域。公开资料显示,ZOLOZ是蚂蚁数科的科技品牌,以生…

电商技术揭秘九:搜索引擎中的SEO数据分析与效果评估

相关系列文章 电商技术揭秘一:电商架构设计与核心技术 电商技术揭秘二:电商平台推荐系统的实现与优化 电商技术揭秘三:电商平台的支付与结算系统 电商技术揭秘四:电商平台的物流管理系统 电商技术揭秘五:电商平台的个性…

matplotlib手动调用默认配色

matplotlib 画图有个默认配色方案,在画不同图时会保持一致。如: import numpy as np import matplotlib.pyplot as plt# 图 1 数据 x np.arange(12).astype(np.float32) 1 y1 np.log(x) y2 1 / x y3 np.sin(x) # 图 2 数据 a np.random.randn(200…

关于HTTP1.0、1.1、1.x、2.0、3.0与HTTPS之间的理解

关于HTTP1.0、1.1、1.x、2.0、3.0与HTTPS之间的理解 HTTP的由来 HTTP是Hyper Text Transfer Protocol(超文本传输协议)的缩写。它的发展是万维网协会(World Wide Web Consortium)和Internet工作小组IETF(Internet Eng…

JMeter控制器数据库获取一组数据后遍历输出

目录 1、测试计划中添加Mysql Jar包 2、添加线程组 3、添加 jdbc connection configuration 4、添加JDBC Request,从数据库中获取数据 5.获取数据列表,提取所有goodsName信息 6.通过添加控制器遍历一组数据 6.1 方式一:循环控制器方式 …

Day42:动态规划 LeedCode 01背包 416. 分割等和子集

01背包 1.确定dp数组以及下标的含义 dp[i][j]的含义:从下标为[0-i]的物品里任意取,放进容量为j的背包,价值总和最大是多少。 那么可以有两个方向推出来dp[i][j] 2.确定递推公式 不放物品i:由dp[i - 1][j]推出,即背…

记一次Mysql数据库宕机This could be because you hit a bug.

Hi I’m Shendi 今天收到消息说所有软件不能用了,网页都打不开,遇到了问题,于是在这里记录一下 记一次Mysql数据库宕机This could be because you hit a bug. 起因 为了节省成本,对于小公司而言服务器数量通常不会太多&#xff…

网络安全学习路线-超详细

零基础小白,到就业!入门到入土的网安学习路线! 在各大平台搜的网安学习路线都太粗略了。。。。看不下去了! 建议的学习顺序: 一、网络安全学习普法(心里有个数,要进去坐几年!&#x…

FRDM-MCXN947开发板之RGB灯

一、背景 RGB LED:通过红、绿、蓝三种颜色组合发光的LED,可以理解由三个不同发光属性的LED组成,这个是LCD平板显示原理的基础,一个LED相当于屏幕上面的一个像素 FRDM-MCXN947集成了一块RGB LED,它由三个GPIO口驱动&am…

2024 NTFS读写工具Tuxera NTFS for Mac 是如何进行下载、安装、激活的

本篇将为各位小伙伴们集中讲解一下NTFS读写工具Tuxera NTFS for Mac 是如何进行下载、安装、激活与换机的。 在数字化时代,数据交换和共享变得日益重要。然而,对于Mac用户来说,与Windows系统之间的文件交换可能会遇到一些挑战。这是因为Mac …

【Markdown】调整图片大小和对齐方式

插入图片 使用HTML: <img src"./xxx.png" width "xxx" height "xxx" />比如说我们插入一个图片&#xff0c;系统会自动帮我们生成一个图片链接 把这段链接插入即可 <img src"https://img-blog.csdnimg.cn/direct/66da1f6404…

大模型日报|今日必读的10篇大模型论文

大家好&#xff0c;今日必读的大模型论文来啦&#xff01; 1.谷歌推出新型 Transformer 架构&#xff1a;反馈注意力就是工作记忆 虽然 Transformer 给深度学习带来了革命性的变化&#xff0c;但二次注意复杂性阻碍了其处理无限长输入的能力。 谷歌研究团队提出了一种新型 T…

《自动机理论、语言和计算导论》阅读笔记:p225-p260

《自动机理论、语言和计算导论》学习第 9 天&#xff0c;p225-p260总结&#xff0c;总计 26 页。 一、技术总结 1.pushdown automation(PDA&#xff0c;下推自动机) 2.DPDA Deterministic PDA(确定性下推自动机)。 二、英语总结 1.instantaneous (1)instant: adj. happi…
最新文章