Vue 3 30天精进之旅:Day 13 - 路由守卫

在构建单页面应用时,路由守卫是一个非常重要的概念。它允许我们在路由进入或离开时执行一些操作,比如验证用户权限、处理数据加载、执行导航确认等。Vue Router提供了多种类型的路由守卫,使我们能够灵活地控制路由的行为。在今天的学习中,我们将重点探讨以下内容:

  1. 路由守卫概述
  2. 全局守卫
  3. 路由独享守卫
  4. 组件内守卫
  5. 动态路由守卫
  6. 使用实际示例理解路由守卫
  7. 总结与实践

1. 路由守卫概述

路由守卫是指在路由确认的过程中执行的一些钩子函数,用于控制路由的访问及处理。在Vue Router中,主要有以下几种路由守卫:

  • 全局守卫:在所有路由变化前后生效。
  • 路由独享守卫:只在特定路由的变化时生效。
  • 组件内守卫:在组件的生命周期中执行的守卫。

通过这些守卫,你可以放心地控制用户访问权限、加载数据、显示loading等状态。

2. 全局守卫

全局守卫是在创建路由实例时通过 router.beforeEach 和 router.afterEach 方法定义的。beforeEach 会在每次路由切换前执行,而 afterEach 则在路由切换后执行。

示例

javascript

// main.js
import { createRouter, createWebHistory } from 'vue-router';
import store from './store'; // 引入Vuex Storeconst routes = [/* 定义路由 */
];const router = createRouter({history: createWebHistory(),routes,
});// 全局前置守卫
router.beforeEach((to, from, next) => {const isAuthenticated = store.state.user.isAuthenticated; // 从Vuex中检验用户认证状态if (to.meta.requiresAuth && !isAuthenticated) {next({ name: 'login' }); // 未登录,重定向到登录页} else {next(); // 继续路由}
});// 全局后置守卫
router.afterEach((to, from) => {console.log('Navigated to:', to.name);
});export default router;

在这个示例中,beforeEach 用于检查用户是否已认证,如果目标路由需要认证但用户未登录,则重定向到登录页面。

3. 路由独享守卫

路由独享守卫是在特定路由配置中的 beforeEnter 函数。它仅在该路由被访问时执行。

示例

javascript

const routes = [{path: '/protected',component: ProtectedView,beforeEnter: (to, from, next) => {const isAuthenticated = store.state.user.isAuthenticated;if (isAuthenticated) {next(); // 继续访问} else {next({ name: 'login' }); // 重定向到登录}},},
];

在这个示例中,beforeEnter 检查用户是否认证,只有认证用户才可以访问 /protected 页面。

4. 组件内守卫

组件内守卫是指在某个组件的主入口中定义的守卫,有三个主要钩子函数:beforeRouteEnterbeforeRouteUpdate 和 beforeRouteLeave

示例

javascript

export default {name: 'SomeComponent',beforeRouteEnter(to, from, next) {// 在路由进入前执行console.log('Entering SomeComponent');next();},beforeRouteUpdate(to, from, next) {// 在路由更新时执行console.log('Updating SomeComponent');next();},beforeRouteLeave(to, from, next) {// 在路由离开前执行const answer = window.confirm('Are you sure you want to leave this page?');if (answer) {next();} else {next(false); // 取消导航}},
};

在这个示例中,beforeRouteLeave 可以处理用户在页面离开之前的确认提示。

5. 动态路由守卫

动态路由守卫是在创建路由时定义的,用于在特定条件下运行的守卫。例如,根据用户的角色权限决定用户能访问哪些路由。

示例

javascript

const routes = [{path: '/admin',component: AdminView,meta: { requiresAuth: true, roles: ['admin'] },beforeEnter: (to, from, next) => {const userRole = store.state.user.role;if (to.meta.roles.includes(userRole)) {next();} else {next({ name: 'forbidden' });}},},
];

这里通过 meta 和路由守卫来验证用户角色,只有具有 admin 角色的用户能够访问该路由。

6. 使用实际示例理解路由守卫

下面是一个简单的应用示例,它集成了全局守卫、路由独享守卫和组件内守卫:

组件示例

vue

<template><div><h1>Welcome to My App</h1><router-link to="/protected">Go to Protected Page</router-link><router-link to="/admin">Go to Admin Page</router-link></div>
</template><script>
export default {name: 'Home',
};
</script>

路由配置示例

javascript

const routes = [{ path: '/', component: Home },{ path: '/protected', component: ProtectedView, meta: { requiresAuth: true } },{ path: '/admin', component: AdminView, meta: { requiresAuth: true, roles: ['admin'] } },{ path: '/login', component: Login },{ path: '/forbidden', component: Forbidden },
];const router = createRouter({history: createWebHistory(),routes,
});// 全局守卫
router.beforeEach((to, from, next) => {const isAuthenticated = store.state.user.isAuthenticated;if (to.meta.requiresAuth && !isAuthenticated) {next({ name: 'login' });} else {next();}
});

在这个例子中,用户在未认证的情况下尝试访问受保护的页面时,将被重定向到登录页面。

7. 总结与实践

今天我们探讨了路由守卫的相关知识,了解了全局守卫、路由独享守卫和组件内守卫的具体用法。路由守卫的使用使得我们能够在路由切换时执行自定义逻辑,从而实现更加复杂的访问控制和数据处理逻辑。

练习

  1. 在你的项目中实现一个需要登录才能访问的受保护页面,并使用路由守卫来控制访问。
  2. 创建一个拥有角色权限的管理系统,使用动态路由守卫控制不同角色用户的访问权限。
  3. 尝试在组件内守卫中添加确认离开的逻辑,防止用户在未保存的情况下离开页面。

通过完成这些练习,你将对路由守卫的使用有更深入的理解。在接下来的学习中,我们将探索 Vue 的动画 相关内容,敬请期待!

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

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

相关文章

结构体DMA串口接收比特错位

发送&#xff1a; 显示&#xff1a; uint16_t接收时候会比特错位。

经典本地影音播放器MPC-BE.

经典本地影音播放器MPC-BE 链接&#xff1a;https://pan.xunlei.com/s/VOIAZbbIuBM1haFdMYCubsU-A1?pwd4iz3# MPC-BE&#xff08;Media Player Classic Black Edition&#xff09;是来自 MPC-HC&#xff08;Media Player Classic Home Cinema&#xff09;的俄罗斯开发者重新…

python学opencv|读取图像(五十四)使用cv2.blur()函数实现图像像素均值处理

【1】引言 前序学习进程中&#xff0c;对图像的操作均基于各个像素点上的BGR值不同而展开。 对于彩色图像&#xff0c;每个像素点上的BGR值为三个整数&#xff0c;因为是三通道图像&#xff1b;对于灰度图像&#xff0c;各个像素上的BGR值是一个整数&#xff0c;因为这是单通…

【开源免费】基于Vue和SpringBoot的工作流程管理系统(附论文)

本文项目编号 T 193 &#xff0c;文末自助获取源码 \color{red}{T193&#xff0c;文末自助获取源码} T193&#xff0c;文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…

IntelliJ IDEA远程开发代理远程服务器端口(免费内网穿透)

IntelliJ IDEA远程开发代理远程服务器端口&#xff08;免费内网穿透&#xff09;&#xff08;JetBrains家的其他IDE应该也支持&#xff09; 之前看到宇宙第一IDE VS Code好像默认代理了远程的端口&#xff0c;但是一直没找到IDEA的同类功能&#xff0c;这次终于发现了 以Intell…

文字显示省略号

多行文本溢出显示省略号

STM32_SD卡的SDIO通信_DMA读写

本篇&#xff0c;将使用CubeMXKeil&#xff0c;创建一个SD卡的DMA读写工程。 目录 一、简述 二、CubeMX 配置 SDIO DMA 三、Keil 编辑代码 四、实验效果 实现效果&#xff0c;如下图&#xff1a; 一、简述 上篇已简单介绍了SD、SDIO&#xff0c;本篇不再啰嗦&#xff0c;…

智能小区物业管理系统推动数字化转型与提升用户居住体验

内容概要 在当今快速发展的社会中&#xff0c;智能小区物业管理系统的出现正在改变传统的物业管理方式。这种系统不仅仅是一种工具&#xff0c;更是一种推动数字化转型的重要力量。它通过高效的技术手段&#xff0c;将物业管理与用户居住体验紧密结合&#xff0c;无疑为社区带…

基于STM32景区环境监测系统的设计与实现(论文+源码)

1系统方案设计 根据系统功能的设计要求&#xff0c;展开基于STM32景区环境监测系统设计。如图2.1所示为系统总体设计框图。系统以STM32单片机作为系统主控模块&#xff0c;通过DHT11传感器、MQ传感器、声音传感器实时监测景区环境中的温湿度、空气质量以及噪音数据。系统监测环…

八. Spring Boot2 整合连接 Redis(超详细剖析)

八. Spring Boot2 整合连接 Redis(超详细剖析) 文章目录 八. Spring Boot2 整合连接 Redis(超详细剖析)2. 注意事项和细节3. 最后&#xff1a; 在 springboot 中 , 整合 redis 可以通过 RedisTemplate 完成对 redis 的操作, 包括设置数据/获取数据 比如添加和读取数据 具体整…

【Unity3D】Tilemap俯视角像素游戏案例

目录 一、导入Tilemap 二、导入像素风素材 三、使用Tilemap制作地图 3.1 制作Tile Palette素材库 3.2 制作地图 四、实现A*寻路 五、待完善 一、导入Tilemap Unity 2019.4.0f1 已内置Tilemap 需导入2D Sprite、2D Tilemap Editor、以及一个我没法正常搜出的2D Tilemap…

企微SCRM驱动企业私域流量营销与客户关系管理的智慧革新

内容概要 在当今竞争激烈的商业环境中&#xff0c;企微SCRM逐渐成为企业实现私域流量营销和优化客户关系管理的重要工具。它的出现不仅提升了企业的工作效率&#xff0c;也改变了传统的营销方式。那么&#xff0c;究竟什么是企微SCRM呢&#xff1f;简单来说&#xff0c;它是将…

数据库、数据仓库、数据湖有什么不同

数据库、数据仓库和数据湖是三种不同的数据存储和管理技术&#xff0c;它们在用途、设计目标、数据处理方式以及适用场景上存在显著差异。以下将从多个角度详细说明它们之间的区别&#xff1a; 1. 数据结构与存储方式 数据库&#xff1a; 数据库主要用于存储结构化的数据&…

前端力扣刷题 | 6:hot100之 矩阵

73. 矩阵置零 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 法一&#xff1a; var setZeroes function(matrix) {let setX new Set(); // 用于存储需要置零的行索引let setY new Set(); //…

【编译系列】Torch.compile()训练编译——算子融合逻辑 工程化

1. 背景: torch.compile()中,Dynamo作为前端负责计算图的捕获,后端有inductor、tvm等进行编译优化。 Dynamo:在Python字节码层面注入pass,实现bytecode-to-bytecode的优化,通过对bytecode逐行进行解析构建FX GraphInductor:负责对FX Graph进行AOTAutograd生成joint-gra…

Docker 部署教程jenkins

Docker 部署 jenkins 教程 Jenkins 官方网站 Jenkins 是一个开源的自动化服务器&#xff0c;主要用于持续集成&#xff08;CI&#xff09;和持续交付&#xff08;CD&#xff09;过程。它帮助开发人员自动化构建、测试和部署应用程序&#xff0c;显著提高软件开发的效率和质量…

2025/2/3 云服务器数据库与idea相连

幸福就摆在你面前&#xff0c;你却把阴影当成山川瀑布&#xff0c;你说你无法幸福。 轻量应用服务器https://swasnext.console.aliyun.com/servers/cn-heyuanhttps://swasnext.console.aliyun.com/servers/cn-heyuanhttps://swasnext.console.aliyun.com/servers/cn-heyuanhttp…

【memgpt】letta 课程1/2:从头实现一个自我编辑、记忆和多步骤推理的代理

llms-as-operating-systems-agent-memory llms-as-operating-systems-agent-memory内存 操作系统的内存管理

6. 【Vue实战--孢子记账--Web 版开发】-- 主币种设置

从这篇文章开始我们将一起实现孢子记账的功能&#xff0c;这篇文章实现主币种设置。这个功能比较简单&#xff0c;因此我们从这个功能开始做。 一、功能 根据项目前期的需求调研&#xff0c;用户需要在设置主币种的时候查看汇率信息&#xff08;别问为什么有这么个需求&#…

51单片机(STC89C52)开发:点亮一个小灯

软件安装&#xff1a; 安装开发板CH340驱动。 安装KEILC51开发软件&#xff1a;C51V901.exe。 下载软件&#xff1a;PZ-ISP.exe 创建项目&#xff1a; 新建main.c 将main.c加入至项目中&#xff1a; main.c:点亮一个小灯 #include "reg52.h"sbit LED1P2^0; //P2的…