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.mzph.cn/news/812938.shtml

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

相关文章

中仕公考:三支一扶期满后有编制吗?

三支一扶两年的期限到达之后,会自动获得编制吗? 完成三支一扶项目的服务期限后,参与人员必须通过正式的考试才能获得编制,而并不是期满后自动获得编制。但是,三支一扶服务期满人员在参加公务员考试中可依照其身份享受加分的优惠…

中国软件商业模式

很多IT技术人、风险投资人这些年进入SaaS产业,写了大量的文章来诊断中国软件产业。 我只是看过去十年的中国软件百强,这是事实上在中国这片土地上长出来并且跑出来的厂商。实践是检验一切真理的唯一标准。说美国怎么样怎么样,中国甲方企业和中…

QA测试开发工程师面试题满分问答12: 用户上传照片如何设计测试用例并进行测试

针对用户上传照片的功能,以下是一些从 QA 角度设计测试用例的示例,涵盖了前端功能点、后端功能点、缓存、异常处理、资源占用、并发和网络等维度: 前端功能点: a. 用户界面:验证上传照片的用户界面是否易于使用和导航&…

标准孔板简单适应性强

即使生活一地鸡毛,但仍然要觉得未来可期,做自己而不是解释自己,只要能变好,慢点又如何,愿我们都是苦尽甘来的人,熬得住就出众,熬不住就出局,鹤壁永成矿山,在行业坚持十余…

基于matlab动态化绘制一个彩色边框的爱心

一、版本1 % 定义爱心曲线的参数方程 t linspace(0, 2*pi, 100); x 16*sin(t).^3; y 13*cos(t) - 5*cos(2*t) - 2*cos(3*t) - cos(4*t);% 创建图形 figure; axis equal; axis off; title(爱心);% 循环遍历每个点,绘制不同颜色的线段 for i 1:length(t)-1% 清除…

Docker 镜像 用普通用户启动服务

Docker镜像内用普通用户启动服务 Docker是一种用于构建、封装和分发应用程序的开源平台。它利用容器化技术将应用程序及其依赖项打包到一个可移植的容器中,从而实现快速部署和可伸缩性。 在Docker中,通过使用Docker镜像可以创建容器,镜像是容…

Selenium+TestNG学习笔记

------------------TestNG-------------------- 1.层级 suite -》test-》class-》method 建议层级 class对应一个测试用例,suite对应一个测试集 2. testNG中的PO模式 3.运行多个测试类的测试用例 通过suite来进行管理;suite在testNG中可以通过xml 来进行编写管理…

Vue.js组件精讲 第4章 组件的通信2:派发与广播——自行实现dispatch和broadcast方法

上一讲的 provide / inject API 主要解决了跨级组件间的通信问题,不过它的使用场景,主要是子组件获取上级组件的状态,跨级组件间建立了一种主动提供与依赖注入的关系。然后有两种场景它不能很好的解决: 父组件向子组件&#xff0…

【Hello算法】 > 第 2 关 >数据结构 之 数组与链表

数据结构 之 数组与链表 1:Understanding data structures !——了解数据结构——1.1:Classification-分类-1.2:Type-类型- 2:Arrays are the bricks that make up the wall of data structures *——数组是组成数据结…

django基于python的法院执法案件管理系统

本课题使用Python语言进行开发。代码层面的操作主要在PyCharm中进行,将系统所使用到的表以及数据存储到MySQL数据库中,方便对数据进行操作本课题基于WEB的开发平台,设计的基本思路是: 框架:django/flask 后端&#xff…

算法题解记录10+++缺失的第一个正数

题目描述: 给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。 请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。 示例 1: 输入:nums [1,2,0] 输出:3 解释:范围 […

Spring与Spring Boot的区别:从框架设计到应用开发

这是我自己开发的一款小程序,感兴趣的可以体验一下: 进入正题: 在Java开发领域,Spring和Spring Boot都是备受推崇的框架,它们为开发人员提供了丰富的功能和便捷的开发体验。然而,许多人对它们之间的区别仍…

MySQL的基础操作(二)

目录 一.数据库约束 1.主键约束 (Primary Key) 2.唯一约束 (Unique) 3.外键约束 (Foreign Key): 4.检查约束(Check) 5.默认约束 (Default) 二.聚合查询 1.简单聚合函数 2.GROUP BY子句 3.HAVING子句 三.联合查询 1.内连接 2.左连接 3.右连接 4.子查询 5.合并查询…

大数据实训进行时:数据标注项目

数据标注项目 培训目的 让同学们先熟悉理论知识,如:识别障碍物是否满足拉框的要求,如何进行拉框;熟悉标注操作,培养出能够进入正式项目的人员 培训地点 理论:学术报告厅、阶梯教室 实操:1实…

【WPF应用42】WPF中的 GroupBox 控件详解

在 Windows Presentation Foundation (WPF) 中,控件是构建用户界面 (UI) 的基础。WPF 提供了丰富的控件库,其中包括 GroupBox 控件,它用于将相关的 UI 元素组织到逻辑分组中。在本博客文章中,我们将详细介绍 GroupBox 控件的功能、…

自己整理的ICT云计算题库四

14. 【多选题】 CIFS 支持的认证方式是以下哪些选项? A: A 全局认证 B: B LADP 域 C: C 本地认证 D: D AD 域 答案 正确答案:ACD 解释 全局认证为先本地,后AD,再LADP 15. 【单选题】 华为 oceanstor v3 smarterase 在使用时…

基于linux进一步理解核间通讯

芯片架构分为同构和异构: 如下图TC397: 如下图TDA4: 如下图STM32MP157: 非对称多处理结构(AMP): AMP 结构是指每个内核运行自己的 OS 或同一 OS 的独立实例&#

MTK Android13 霸屏实现

一、背景 在台式POS场景下,经常有应用会需要获取霸屏的权限,隐藏状态栏或者导航栏,且不能被划出,其实系统已经系统了隐藏状态栏也导航栏的接口,但是无法做到禁止滑出。 View decorView ((Activity) context).getWin…

Day53 动态规划 part14

Day53 动态规划 part14 1143.最长公共子序列 我的思路: 模仿昨天的最大重复子序列长度的思路,可以列出如下状态转移方程 对着状态转移方程写代码即可,还是需要注意,i, j是从1开始的,比较的时候是str1[i -1]和str2[j…

【PG-1】PostgreSQL体系结构概述

1. PostgreSQL体系结构概述 代码结构 其中,backend是后端核心代码,包括右边的几个dir: access:处理数据访问方法和索引的代码。 bootstrap:数据库初始化相关的代码。 catalog:系统目录(如表和索引的元数据…