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

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

相关文章

C++模板编程——可变参函数模板

目录 1. 可变参函数模板基本介绍 2. 参数包展开——通过递归函数 3. 参数包展开——通过编译期间if语句(constexpr if) 4. 重载 5. 后记 进来看的小伙伴们应该对C中的模板有了一定了解&#xff0c;下面给大家介绍一下可变参函数模板。过于基础的概念将不仔细介绍。 1. 可变…

ChatGPT-4o和ChatGPT-4o mini的差异点

在人工智能领域&#xff0c;OpenAI再次引领创新潮流&#xff0c;近日正式发布了其最新模型——ChatGPT-4o及其经济实惠的小型版本ChatGPT-4o Mini。这两款模型虽同属于ChatGPT系列&#xff0c;但在性能、应用场景及成本上展现出显著的差异。本文将通过图文并茂的方式&#xff0…

2025最新源支付V7全套开源版+Mac云端+五合一云端

2025最新源支付V7全套开源版Mac云端五合一云端 官方1999元&#xff0c; 最新非网上那种功能不全带BUG开源版&#xff0c;可以自己增加授权或二开 拥有卓越的性能和丰富的功能。它采用全新轻量化的界面UI&#xff0c;让您能更方便快捷地解决知识付费和运营赞助的难题 它基于…

数据分析系列--[12] RapidMiner辨别分析(含数据集)

一、数据准备 二、导入数据 三、数据预处理 四、建模辨别分析 五、导入测试集进行辨别分析 一、数据准备 点击下载数据集 二、导入数据 三、数据预处理 四、建模辨别分析 五、导入测试集进行辨别分析 Ending, congratulations, youre done.

当卷积神经网络遇上AI编译器:TVM自动调优深度解析

从铜线到指令&#xff1a;硬件如何"消化"卷积 在深度学习的世界里&#xff0c;卷积层就像人体中的毛细血管——数量庞大且至关重要。但鲜有人知&#xff0c;一个简单的3x3卷积在CPU上的执行路径&#xff0c;堪比北京地铁线路图般复杂。 卷积的数学本质 对于输入张…

51单片机 02 独立按键

一、独立按键控制LED亮灭 轻触按键&#xff1a;相当于是一种电子开关&#xff0c;按下时开关接通&#xff0c;松开时开关断开&#xff0c;实现原理是通过轻触按键内部的金属弹片受力弹动来实现接通和断开。 #include <STC89C5xRC.H> void main() { // P20xFE;while(1){…

wax到底是什么意思

在很久很久以前&#xff0c;人类还没有诞生文字之前&#xff0c;人类就产生了语言&#xff1b;在诞生文字之前&#xff0c;人类就已经使用了语言很久很久。 没有文字之前&#xff0c;人们的语言其实是相对比较简单的&#xff0c;因为人类的生产和生活水平非常低下&#xff0c;…

SSRF 漏洞利用 Redis 实战全解析:原理、攻击与防范

目录 前言 SSRF 漏洞深度剖析 Redis&#xff1a;强大的内存数据库 Redis 产生漏洞的原因 SSRF 漏洞利用 Redis 实战步骤 准备环境 下载安装 Redis 配置漏洞环境 启动 Redis 攻击机远程连接 Redis 利用 Redis 写 Webshell 防范措施 前言 在网络安全领域&#xff0…

【周易哲学】生辰八字入门讲解(八)

&#x1f60a;你好&#xff0c;我是小航&#xff0c;一个正在变秃、变强的文艺倾年。 &#x1f514;本文讲解【周易哲学】生辰八字入门讲解&#xff0c;期待与你一同探索、学习、进步&#xff0c;一起卷起来叭&#xff01; 目录 一、六亲女命六亲星六亲宫位相互关系 男命六亲星…

大模型训练(5):Zero Redundancy Optimizer(ZeRO零冗余优化器)

0 英文缩写 Large Language Model&#xff08;LLM&#xff09;大型语言模型Data Parallelism&#xff08;DP&#xff09;数据并行Distributed Data Parallelism&#xff08;DDP&#xff09;分布式数据并行Zero Redundancy Optimizer&#xff08;ZeRO&#xff09;零冗余优化器 …

玉米苗和杂草识别分割数据集labelme格式1997张3类别

数据集格式&#xff1a;labelme格式(不包含mask文件&#xff0c;仅仅包含jpg图片和对应的json文件) 图片数量(jpg文件个数)&#xff1a;1997 标注数量(json文件个数)&#xff1a;1997 标注类别数&#xff1a;3 标注类别名称:["corn","weed","Bean…

Streamlit入门

1、Streamlit是什么 Streamlit 是一个用于快速构建数据应用的开源 Python 库&#xff0c;由 Streamlit 公司开发并维护。它极大地简化了从数据脚本到交互式 Web 应用的转化过程&#xff0c;让开发者无需具备前端开发的专业知识&#xff0c;就能轻松创建出美观、实用的交互式应…

机器学习算法在网络安全中的实践

机器学习算法在网络安全中的实践 本文将深入探讨机器学习算法在网络安全领域的应用实践&#xff0c;包括基本概念、常见算法及其应用案例&#xff0c;从而帮助程序员更好地理解和应用这一领域的技术。"> 序言 网络安全一直是信息技术领域的重要议题&#xff0c;随着互联…

Rust 所有权特性详解

Rust 所有权特性详解 Rust 的所有权系统是其内存安全的核心机制之一。通过所有权规则&#xff0c;Rust 在编译时避免了常见的内存错误&#xff08;如空指针、数据竞争等&#xff09;。本文将从堆内存与栈内存、所有权规则、变量作用域、String 类型、内存分配、所有权移动、Cl…

java练习(5)

ps:题目来自力扣 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外&#xff0c;这…

[EAI-023] FAST,机器人动作专用的Tokenizer,提高VLA模型的能力和训练效率

Paper Card 论文标题&#xff1a;FAST: Efficient Action Tokenization for Vision-Language-Action Models 论文作者&#xff1a;Karl Pertsch, Kyle Stachowicz, Brian Ichter, Danny Driess, Suraj Nair, Quan Vuong, Oier Mees, Chelsea Finn, Sergey Levine 论文链接&…

CodeGPT使用本地部署DeepSeek Coder

目前NV和github都托管了DeepSeek&#xff0c;生成Key后可以很方便的用CodeGPT接入。CodeGPT有三种方式使用AI&#xff0c;分别时Agents&#xff0c;Local LLMs&#xff08;本地部署AI大模型&#xff09;&#xff0c;LLMs Cloud Model&#xff08;云端大模型&#xff0c;从你自己…

Rust 中的注释使用指南

Rust 中的注释使用指南 注释是代码中不可或缺的一部分&#xff0c;它帮助开发者理解代码的逻辑和意图。Rust 提供了多种注释方式&#xff0c;包括行注释、块注释和文档注释。本文将详细介绍这些注释的使用方法&#xff0c;并通过一个示例展示如何在实际代码中应用注释。 1. 行…

STM32单片机学习记录(2.2)

一、STM32 13.1 - PWR简介 1. PWR&#xff08;Power Control&#xff09;电源控制 &#xff08;1&#xff09;PWR负责管理STM32内部的电源供电部分&#xff0c;可以实现可编程电压监测器和低功耗模式的功能&#xff1b; &#xff08;2&#xff09;可编程电压监测器&#xff08;…

基于SpringBoot的智慧康老疗养院管理系统的设计与实现(源码+SQL脚本+LW+部署讲解等)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…