当前位置: 首页 > article >正文

Vue 3.0 中的路由导航守卫详解

1. 路由导航守卫

1.1. 全局前置守卫

Vue-Router 提供的导航守卫主要用来守卫路由的跳转或取消。它们可以植入到全局、单个路由或组件级别。

全局前置守卫可以使用 router.beforeEach 注册:

const router = createRouter({... });router.beforeEach((to, from) => {// 返回 false 以取消导航return false;
});

当导航触发时,全局前置守卫按照创建顺序调用。守卫是异步解析执行,导航会等待所有守卫解析完成后才会继续。

守卫方法参数:

to:即将要进入的目标路由对象。

from:当前导航正要离开的路由对象。

返回值:

false:取消当前导航。如果浏览器的 URL 改变了,URL 会重置到 from 路由对应的地址。

路由地址:重定向到一个不同的地址,如同调用 router.push()。

undefined 或 true:导航有效,继续下一步。

router.beforeEach(async (to, from) => {if (!isAuthenticated && to.name !== 'Login') {// 将用户重定向到登录页面return { name: 'Login' };}
});

1.2. 全局解析守卫

全局解析守卫在导航被确认之前调用,可以使用 router.beforeResolve 注册。这适用于获取数据或执行其他操作的场景:

router.beforeResolve(async to => {if (to.meta.requiresCamera) {try {await askForCameraPermission();} catch (error) {if (error instanceof NotAllowedError) {// 处理错误并取消导航return false;} else {// 抛出意料之外的错误并取消导航throw error;}}}
});

1.3. 全局后置钩子

全局后置钩子不会改变导航,只执行一些辅助功能,如分析、改变页面标题等:

router.afterEach((to, from) => {sendToAnalytics(to.fullPath);
});

1.4. 路由独享守卫

可以在路由配置中直接定义 beforeEnter 守卫,仅在进入路由时触发:

const routes = [{path: '/users/:id',component: UserDetails,beforeEnter: (to, from) => {// 拒绝导航return false;},},
];

1.5. 组件内的守卫

在路由组件内直接定义守卫,包括 beforeRouteEnter、beforeRouteUpdate 和 beforeRouteLeave:

export default {beforeRouteEnter(to, from, next) {// 在路由改变前调用,无法访问组件实例},beforeRouteUpdate(to, from) {// 在当前路由改变时调用,实例已挂载},beforeRouteLeave(to, from) {// 在导航离开前调用},
};

使用 beforeRouteEnter 守卫访问组件实例,可以通过传递回调给 next:

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

1.6. 使用组合 API

如果使用组合式 API,可以通过 onBeforeRouteUpdate 和 onBeforeRouteLeave 添加 update 和 leave 守卫。

2. 完整的导航解析流程

1. 导航被触发;

2. 调用失活组件的 beforeRouteLeave 守卫;

3. 调用全局的 beforeEach 守卫;

4. 调用重用组件的 beforeRouteUpdate 守卫;

5. 调用路由配置中的 beforeEnter;

6. 解析异步路由组件;

7. 调用被激活组件的 beforeRouteEnter 守卫;

8. 调用全局的 beforeResolve 守卫;

9. 导航被确认;

10. 调用全局的 afterEach 钩子;

11. 触发 DOM 更新;

12. 调用 beforeRouteEnter 守卫中传递给 next 的回调函数,访问组件实例;

3. 路由元信息

有时,你可能希望将任意信息附加到路由上,如过渡名称、谁可以访问路由等。这些事情可以通过接收属性对象的meta属性来实现,并且它可以在路由地址和导航守卫上都被访问到。定义路由的时候你可以这样配置 meta 字段:

const routes = [{path: '/posts',component: PostsLayout,children: [{path: 'new',component: PostsNew,// 只有经过身份验证的用户才能创建帖子meta: { requiresAuth: true },},{path: 'id',component: PostsDetail,// 任何人都可以阅读文章meta: { requiresAuth: false },}]}
];

那么如何访问这个 meta 字段呢?

首先,我们称呼 routes 配置中的每个路由对象为 路由记录。路由记录可以是嵌套的,因此,当一个路由匹配成功后,它可能匹配多个路由记录,匹配成功的路由包括父路由记录以及子路由记录。

一个路由匹配到的所有路由记录会暴露为 route 对象的route.matched 数组。我们需要遍历这个数组来检查路由记录中的 meta 字段,但是 Vue Router 还为你提供了一个 route.meta 方法,它是一个非递归合并所有 meta 字段的方法。这意味着你可以简单地写成:

router.beforeEach((to, from) => {// 而不是去检查每条路由记录// to.matched.some(record => record.meta.requiresAuth)if (to.meta.requiresAuth && !auth.isLoggedIn()) {// 此路由需要授权,请检查是否已登录// 如果没有,则重定向到登录页面return {path: '/login',// 保存我们所在的位置,以便以后再来query: { redirect: to.fullPath },}}
})

4. 路由懒加载

当打包构建应用时,JavaScript 包含变得非常大,影响页面加载。如果我们能把不同路由对应的组件分割成不同的代码块,然后当路由被访问的时候才加载对应组件,这样就会更加高效。

Vue Router 支持开箱即用的动态导入,这意味着你可以用动态导入代替静态导入:


// import UserDetails from './views/UserDetails.vue' 
// 将上面的写法换成下面这样const UserDetails = () => import('./views/UserDetails.vue')const router = createRouter({routes: [{ path: '/users/:id', component: UserDetails },// 或在路由定义里直接使用它{ path: '/users/:id', component: () => import('./views/UserDetails.vue') }]
})

相关文章:

Vue 3.0 中的路由导航守卫详解

1. 路由导航守卫 1.1. 全局前置守卫 Vue-Router 提供的导航守卫主要用来守卫路由的跳转或取消。它们可以植入到全局、单个路由或组件级别。 全局前置守卫可以使用 router.beforeEach 注册: const router createRouter({... });router.beforeEach((to, from) &g…...

【Sqoop基础】Sqoop生态集成:与HDFS、Hive、HBase等组件的协同关系深度解析

目录 1 Sqoop概述与大数据生态定位 2 Sqoop与HDFS的深度集成 2.1 技术实现原理 2.2 详细工作流程 2.3 性能优化实践 3 Sqoop与Hive的高效协同 3.1 集成架构设计 3.2 数据类型映射处理 3.3 案例演示 4 Sqoop与HBase的实时集成 4.1 数据模型转换挑战 4.2 详细集成流程…...

MySQL + CloudCanal + Iceberg + StarRocks 构建全栈数据服务

简述 在业务数据快速膨胀的今天,企业对 低成本存储 与 实时查询分析能力 的需求愈发迫切。 本文将带你实战构建一条 MySQL 到 Iceberg 的数据链路,借助 CloudCanal 快速完成数据迁移与同步,并使用 StarRocks 完成数据查询等操作&#xff0c…...

MSVC支持但是Clang会报错的C++行为

MSVC的非标 目的友元别名模板类显式特例化的命名空间限制 目的 因为在使用clang进行ast分析msvc项目的时候,出现了爆红现象,了解到msvc会有一些不严格按照c标准但是允许的语法,在这点上clang就很严格,所以本文以clang为基准&…...

截屏精灵:轻松截屏,高效编辑

在移动互联网时代,截图已经成为我们日常使用手机时的一项基本操作。无论是记录重要信息、分享有趣内容,还是进行学习和工作,一款好用的截图工具都能极大地提升我们的效率。截屏精灵就是这样一款功能强大、操作简单的截图工具,它不…...

【JavaWeb】基本概念、web服务器、Tomcat、HTTP协议

目录 1. 基本概念1.1 基本概念1.2 web应用程序1.3 静态web1.4 动态web 2. web服务器3. tomcat详解3.1 安装3.2 启动3.3 配置3.3.1 配置启动的端口号3.3.2 配置主机的名称3.3.3 其他常用配置项日志配置数据源配置安全配置 3.4 发布一个网站 4. Http协议4.1 什么是http4.2 http的…...

黑马程序员C++核心编程笔记--4 类和对象--封装

C面向对象三大特征:封装、继承、多态 C认为万事万物皆对象,对象有其属性和行为,具有相同性质的对象可以抽象称为类 4.1 封装 4.1.1 封装的意义 将属性和行为作为一个整体,表现生活中的事物将属性和行为加以权限控制 在设计类…...

Debian:自由操作系统的精神图腾与技术基石

🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 ——解码Linux世界最纯粹的开源哲学 一、Debian的诞生:从个人实验到全球协作 1993年,一位名为Ian Murdock的程序员在开源社区的启…...

云计算Linux Rocky day02(安装Linux系统、设备表示方式、Linux基本操作)

云计算Linux Rocky day02(安装Linux系统、设备表示方式、Linux基本操作) 目录 云计算Linux Rocky day02(安装Linux系统、设备表示方式、Linux基本操作)1、虚拟机VMware安装Rocky2、Linux命令行3、Linux Rocky修改字体大小和背景颜…...

在 ODROID-H3+ 上安装 Win11 系统

在 ODROID-H3 上安装 Windows 11 系统。 以下是完整的步骤,包括 BIOS 设置、U 盘制作、安装和驱动处理,全程不保留之前的系统数据。 ✅ 准备工作 1. 准备一个 ≥8GB 的 USB 启动盘 用另一台电脑制作 Windows 11 安装盘。 👉 推荐工具&…...

Docker常用命令操作指南(一)

Docker常用命令操作指南-1 一、Docker镜像相关命令1.1 搜索镜像(docker search)1.2 拉取镜像(docker pull)1.3 查看本地镜像(docker images)1.4 删除镜像(docker rmi) 二、Docker容器…...

什么是 SQL 注入?如何防范?

什么是 SQL 注入?如何防范? 1. SQL 注入概述 1.1 基本定义 SQL 注入(SQL Injection)是一种通过将恶意SQL 语句插入到应用程序的输入参数中,从而欺骗服务器执行非预期SQL命令的攻击技术。攻击者可以利用此漏洞绕过认证、窃取数据甚至破坏数据库。 关键结论:SQL 注入是O…...

使用el-input数字校验,输入汉字之后校验取消不掉

先说说复现方式 本来input是只能输入数字的&#xff0c;然后你不小心输入了汉字&#xff0c;触发校验了&#xff0c;然后这时候&#xff0c;你发现校验取消不掉了 就这样了 咋办啊&#xff0c;你一看校验没错啊&#xff0c;各种number啥的也写了,发现没问题啊 <el-inputv…...

Docker容器启动失败的常见原因分析

我们在开发部署的时候&#xff0c;用 Docker 打包环境&#xff0c;理论上是“我装好了你就能跑”。但理想很丰满&#xff0c;现实往往一 docker run 下去就翻车了。 今天来盘点一下我实际工作中经常遇到的 Docker 容器启动失败的常见原因&#xff0c;顺便给点 debug 的小技巧&a…...

Java提取markdown中的表格

Java提取markdown中的表格 说明 这篇博文是一个舍近求远的操作&#xff0c;如果只需要要对markdown中的表格数据进行提取&#xff0c;完全可以通过正在表达式或者字符串切分来完成。但是鉴于学习的目的&#xff0c;这次采用了commonmark包中的工具来完成。具体实现过程如下 实…...

立志成为一名优秀测试开发工程师(第七天)——unittest框架的学习

目录 unittest框架的学习 一、测试类的编写 创建相关测试类cal.py、CountTest.py 二、常见断言方法 使用unittest单元测试框架编写测试用例CountTest.py 注意&#xff1a;执行的时候光标一定要放在括号后面&#xff0c;鼠标右键运行 三、对测试环境的初始化和清除模块…...

精益数据分析(85/126):营收阶段的核心指标与盈利模型优化——从数据到商业决策的落地

精益数据分析&#xff08;85/126&#xff09;&#xff1a;营收阶段的核心指标与盈利模型优化——从数据到商业决策的落地 c。 一、营收健康度的核心指标&#xff1a;投资回报率模型 &#xff08;一&#xff09;季度再发性营收增长率&#xff08;QRR&#xff09; 该指标衡量…...

论坛系统(4)

用户详情 获取用户信息 实现逻辑 ⽤⼾提交请求&#xff0c;服务器根据是否传⼊Id参数决定返回哪个⽤⼾的详情 1. 不传⽤⼾Id&#xff0c;返回当前登录⽤⼾的详情(从session获取) 2. 传⼊⽤⼾Id&#xff0c;返回指定Id的⽤⼾详情(根据用户id去查) 俩种方式获得用户信息 参…...

本地Markdown开源知识库选型指南

本地Markdown开源知识库选型指南 以下是几款优秀的本地Markdown开源知识库解决方案&#xff0c;适合不同需求场景&#xff1a; 1. Obsidian (非完全开源但免费) 特点&#xff1a;基于Markdown的本地优先知识管理&#xff0c;丰富的插件生态优势&#xff1a;双向链接、图形视…...

【.net core】SkiaSharp 如何在Linux上实现

1. 安装依赖库 首先需要安装 SkiaSharp 运行时依赖&#xff1a; # Ubuntu/Debian sudo apt-get update sudo apt-get install -y libfontconfig1 libfreetype6 libx11-6 libx11-xcb1 libxcb1 \libxcomposite1 libxcursor1 libxdamage1 libxi6 libxtst6 \libnss3 libcups2 lib…...

后端项目中静态文案国际化语言包构建选型

这是一个很关键的问题。在做国际化&#xff08;i18n&#xff09;时&#xff0c;不同语言包格式如 .resx、.properties 和 .json 都可用&#xff0c;但各自有适用场景、特性与限制&#xff0c;你在选择时可以根据你的开发语言、生态和维护成本权衡。 ✅ 一张对比表&#xff1a;.…...

前端面经 React常见的生命周期

初始化阶段 constructor state的初始化&#xff0c;防抖节流的绑定getDerivedStateFromProps 静态函数 当作纯函数使用 传入props和state&#xff0c;合并成一个新的statecomponentWillMount 组件如果有getDrivedStatefromprops不会执行 针对一些接口的预请求时使用rendercomp…...

力扣面试150题--二叉树的层平均值

Day 54 题目描述 思路 初次做法&#xff08;笨&#xff09;&#xff1a;使用两个队列&#xff0c;一个队列存放树的节点&#xff0c;一个队列存放对应节点的高度&#xff0c;使用x存放上一个节点&#xff0c;highb存放上一个节点的高度&#xff0c;sum存放当前层的节点值之和…...

【Doris入门】Doris初识:分布式分析型数据库的核心价值与架构解析

目录 1 Doris简介与核心价值 2 Doris架构深度解析 2.1 Frontend&#xff08;FE&#xff09;架构 2.2 Backend&#xff08;BE&#xff09;架构 3 Doris核心概念详解 3.1 数据分布模型 3.2 Tablet与Replica 3.3 数据模型 4 Doris关键技术解析 4.1 存储引擎 4.2 查询执…...

C#面试问题41-60

41. What is the Singleton design pattern? Singleton is a class that only allows creating a single instance of itselt. 单例设计模式是一个类&#xff0c;它只允许创建自己的单个实例。 构造函数防止他在单例类以外的地方被调用。 使用情景&#xff1a;need a sing…...

数据结构与算法学习笔记(Acwing 提高课)----动态规划·区间DP

数据结构与算法学习笔记----动态规划区间DP author: 明月清了个风 first publish time: 2025.5.26 ps⭐️区间DP的特征在于子结构一般是一个子区间上的问题&#xff0c;涉及到的问题也非常多&#xff0c;如环形区间&#xff0c;记录方案数&#xff0c;高精度&#xff0c;二维…...

【合集】Linux——31个普通信号

Linux普通信号总表&#xff08;1-31&#xff09;​​ ​编号​​信号名​​触发原因​​默认动作​1SIGHUP终端连接断开&#xff08;如SSH会话终止&#xff09;或守护进程重载配置&#xff08;如nginx -s reload&#xff09;终止进程2SIGINT用户输入CtrlC中断前台进程终止进程…...

从0到1搭建AI绘画模型:Stable Diffusion微调全流程避坑指南

从0到1搭建AI绘画模型&#xff1a;Stable Diffusion微调全流程避坑指南 系统化学习人工智能网站&#xff08;收藏&#xff09;&#xff1a;https://www.captainbed.cn/flu 文章目录 从0到1搭建AI绘画模型&#xff1a;Stable Diffusion微调全流程避坑指南摘要引言一、数据集构…...

ASP.NET Core 中JWT的基本使用

文章目录 前言一、JWT与RBAC二、JWT 的作用三、RBAC 的核心思想四、使用1、配置文件 (appsettings.json)2、JWT配置模型 (Entity/JwtSettings.cs)3、服务扩展类&#xff0c;JWT配置 (Extensions/ServiceExtensions.cs)4、用户仓库接口服务5、认证服务 (Interface/IAuthService.…...

未来技术展望

应用场景:海量数据并行处理 技术融合: # 概念代码:量子加速的数据清洗 from quantum_processor import PhotonicProcessordef quantum_data_cleaning(data):# 使用光量子处理器并行处理千万级数据processor = PhotonicProcessor(model="Xanadu Borealis")return …...