局部路由守卫

局部路由守卫为我们提供了更细粒度的路由控制,允许我们在特定的路由或组件级别添加鉴权和逻辑处理。局部路由守卫分为 path 守卫和 component 守卫,它们分别适用于不同的场景。

path 守卫(路由守卫)

path 守卫用于在进入特定路由之前执行逻辑处理,如鉴权、数据预加载等。它的书写位置是在 route 对象中,通过 beforeEnter 方法来设置。

javascript

import { createRouter, createWebHistory } from 'vue-router';
import Home from '../views/Home.vue';
import Cart from '../views/Cart.vue';
import Profile from '../views/Profile.vue';
import Login from '../views/Login.vue';const routes = [{path: '/',name: 'Home',component: Home},{path: '/cart',name: 'Cart',component: Cart,beforeEnter: (to, from, next) => {const isLoggedIn = localStorage.getItem('isLoggedIn');if (!isLoggedIn) {next({ name: 'Login' });} else {next();}}},{path: '/profile',name: 'Profile',component: Profile,beforeEnter: async (to, from, next) => {const isLoggedIn = localStorage.getItem('isLoggedIn');if (!isLoggedIn) {next({ name: 'Login' });} else {try {// 模拟异步数据预加载const userData = await fetchUserData();to.meta.userData = userData;next();} catch (error) {console.error('数据预加载失败:', error);next({ name: 'ErrorPage' });}}}},{path: '/login',name: 'Login',component: Login}
];const router = createRouter({history: createWebHistory(),routes
});// 模拟异步获取用户数据
function fetchUserData() {return new Promise((resolve, reject) => {setTimeout(() => {const userData = {name: 'John Doe',email: 'johndoe@example.com'};resolve(userData);}, 1000);});
}export default router;

在上述代码中,我们为 /cart 和 /profile 路由添加了 beforeEnter 守卫。对于 /cart 路由,我们检查用户是否登录,如果未登录则跳转到登录页面。对于 /profile 路由,我们不仅检查用户是否登录,还模拟了异步数据预加载。如果数据预加载失败,我们将跳转到错误页面。

component 守卫(组件守卫)

component 守卫用于在路由组件进入或离开时执行逻辑处理,如数据清理、确认提示等。它的书写位置是在路由组件当中,也就是 .vue 文件里。在 setup 语法糖中,我们可以使用 onBeforeRouteUpdate 和 onBeforeRouteLeave 方法来设置组件守卫。

vue

<template><div><h1>detail组件-{{ id }}</h1><button @click="router.back()">返回</button><hr><h2>猜你喜欢</h2><ol><li @click="goDetailLike">忠犬八公</li></ol></div>
</template><script setup>
import { watch } from 'vue';
import { onBeforeRouteLeave, onBeforeRouteUpdate, useRoute, useRouter } from 'vue-router';const route = useRoute();
const router = useRouter();let id = route.query.id;const goDetailLike = () => {router.push({name: 'detail',query: {id: '5566'}});
};onBeforeRouteUpdate((to, from) => {console.log(`根据${to.query.id}请求数据`);// 可以在这里进行数据更新操作fetchData(to.query.id);
});onBeforeRouteLeave(() => {let flag = window.confirm('你确定要离开吗');if (!flag) return false;// 可以在这里进行数据清理操作clearData();
});// 模拟异步获取数据
function fetchData(id) {return new Promise((resolve, reject) => {setTimeout(() => {console.log(`获取到 ${id} 的数据`);resolve();}, 1000);});
}// 模拟数据清理
function clearData() {console.log('清理数据');
}
</script><style scoped></style>

在上述代码中,onBeforeRouteUpdate 守卫会在当前路由更新时触发,我们可以在这里进行数据更新操作。onBeforeRouteLeave 守卫会在离开当前路由组件前触发,我们可以在这里进行确认提示和数据清理操作。

局部路由守卫的组合使用

在实际应用中,我们可以组合使用 path 守卫和 component 守卫,以实现更复杂的路由控制。例如,我们可以在 path 守卫中进行全局鉴权,在 component 守卫中进行组件级别的数据处理和提示。

javascript

// router/index.js
const routes = [{path: '/admin',name: 'Admin',component: Admin,beforeEnter: (to, from, next) => {const isAdmin = localStorage.getItem('isAdmin');if (!isAdmin) {next({ name: 'Forbidden' });} else {next();}}}
];// Admin.vue
<template><div><h1>管理员页面</h1></div>
</template><script setup>
import { onBeforeRouteLeave } from 'vue-router';onBeforeRouteLeave(() => {let flag = window.confirm('你确定要离开管理员页面吗');if (!flag) return false;
});
</script><style scoped></style>

在上述代码中,我们在 path 守卫中检查用户是否为管理员,如果不是则跳转到禁止访问页面。在 component 守卫中,我们在离开管理员页面时进行确认提示。通过组合使用 path 守卫和 component 守卫,我们可以实现更灵活和安全的路由控制。

编辑

分享

在全局后置守卫中更新页面标题的具体步骤是什么?

如何在全局后置守卫中记录用户访问路径?

除了更新标题栏和记录路径,全局后置守卫还能实现哪些功能?

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

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

相关文章

Android 16应用适配指南

Android 16版本特性介绍 https://developer.android.com/about/versions/16?hlzh-cn Android 16 所有功能和 API 概览 https://developer.android.com/about/versions/16/features?hlzh-cn#language-switching Android 16 发布时间 Android 16 适配指南 Google开发平台&…

android display 笔记(十二)CPU,GPU,DPU的区别

CPU&#xff08;Central Processing Unit&#xff09;通用计算&#xff1a;处理复杂逻辑、分支预测、多任务调度。 低延迟&#xff1a;优先快速响应单线程任务。 GPU&#xff08;Graphics Processing Unit&#xff09; 高吞吐量并行计算&#xff1a;适合大规模数据并行处理。…

音频转文本:如何识别音频成文字

Python脚本:MP4转MP3并语音识别为中文 以下是一个完整的Python脚本,可以将MP4视频转换为MP3音频,然后使用语音识别模型将音频转换为中文文本。 准备工作 首先需要安装必要的库: pip install moviepy pydub SpeechRecognition openai-whisper完整脚本 import os from m…

理解 MCP 协议的数据传递:HTTP 之上的一层“壳子

以下是以 CSDN 博客的风格记录你对 MCP 协议数据传递的理解和发现&#xff0c;内容涵盖了 MCP 协议基于 HTTP 的本质、JSON-RPC 的“壳子”作用&#xff0c;以及为什么熟悉 HTTP 协议就足以理解 MCP 的数据传递。文章面向技术社区&#xff0c;结构清晰&#xff0c;适合分享。 理…

基于ssm网络游戏推荐系统(源码+lw+部署文档+讲解),源码可白嫖!

摘要 当今社会进入了科技进步、经济社会快速发展的新时代。国际信息和学术交流也不断加强&#xff0c;计算机技术对经济社会发展和人民生活改善的影响也日益突出&#xff0c;人类的生存和思考方式也产生了变化。传统网络游戏管理采取了人工的管理方法&#xff0c;但这种管理方…

vue入门:指令

文章目录 vue的内置指令说明&#xff1a; 自定义指令 vue的内置指令 Vue 指令的本质是&#xff1a; 声明式的 DOM 操作接口&#xff08;隐藏底层 JavaScript 代码&#xff09;。响应式数据的绑定媒介&#xff08;连接数据和视图&#xff09;。模板编译的标记&#xff08;最终…

oracle 索引失效

在 Oracle 11g 中&#xff0c;索引失效的常见原因包括函数修改列、隐式类型转换、统计信息过时等&#xff0c;解决方法需结合版本特性&#xff08;如虚拟列、索引跳跃扫描&#xff09;。通过执行计划分析、统计信息维护和合理使用提示&#xff08;Hints&#xff09;&#xff0c…

k8s蓝绿发布

k8s蓝绿发布 什么是蓝绿部署K8S中如何实现蓝绿部署k8s蓝绿部署流程图 什么是蓝绿部署 参考: https://youtu.be/CLq_hA0lAd0 https://help.coding.net/docs/cd/best-practice/blue-green.html 蓝绿部署最早是由马丁福勒 2010年在他的博客中提出. 蓝绿部署是一种软件部署策略,用…

stm32面试

数据结构相关问题 stm32面试 数据结构相关问题 目录基础数据结构树与图排序与查找算法 Linux相关问题Linux系统基础Linux命令与脚本Linux网络与服务 操作系统相关问题操作系统基础概念操作系统调度算法操作系统同步与通信 STM32相关问题STM32硬件基础STM32编程与开发STM32应用与…

Mybatis 中 mappers标签 package的使用

MyBatis 的配置文件中&#xff0c;<mappers> 标签用于指定 MyBatis 应该加载哪些映射器&#xff08;Mapper&#xff09;。其中 package 属性是一种便捷的方式来批量注册多个映射器接口 package 属性允许你指定一个包名&#xff0c;MyBatis 会自动扫描该包下的所有映射器…

设计模式 --- 访问者模式

访问者模式是一种行为设计模式&#xff0c;它允许在不改变对象结构的前提下&#xff0c;定义作用于这些对象元素的新操作。 优点&#xff1a; 1.​​符合开闭原则&#xff1a;新增操作只需添加新的访问者类&#xff0c;无需修改现有对象结构。 ​​2.操作逻辑集中管理​​&am…

监控docker中的java应用

1)进入指定的容器 docker exec -it demo /bin/bash 2)下载curl root89a67e345354:/# apt install curl -y 3)下载arthas root89a67e345354:/# curl -O https://arthas.aliyun.com/arthas-boot.jar 4)运行 root89a67e345354:/# java -jar arthas-boot.jar 5)监控 […

最新版RubyMine超详细图文安装教程,带补丁包(2025最新版保姆级教程)

目录 前言 一、RubyMine最新版下载 二、RubyMine安装 三、RubyMine补丁 四、运行RubyMine 前言 RubyMine是由JetBrains开发的集成开发环境&#xff08;IDE&#xff09;&#xff0c;专为Ruby和Ruby on Rails开发者设计&#xff0c;提供智能代码补全、调试、测试、版本控制集…

数字政府与智慧城市区别报告分析

数字政府与智慧城市区别报告分析 一、引言 随着信息技术的飞速发展&#xff0c;数字政府和智慧城市成为推动城市现代化和治理能力提升的两个重要概念。虽然它们都依托于信息技术&#xff0c;但二者在目标、内涵、实施路径等方面存在显著差异。本文旨在深入探讨数字政府与智慧…

[MRCTF2020]ezpop wp

本题考点:php反序列化的pop链 首先来了解一下pop链是什么,它类似于多米诺骨牌一环套一环,要调用这个成员方法然后去找能调用这个方法的魔术方法,最后一环接一环,完成一个链子,最终形成payload。 那么来了解一下这些魔术方法 __construct() //类的构造函数&#xff0…

spark架构和RDD相关概念

运行架构&#xff1a; Spark采用master - slave结构&#xff0c;Driver作为master负责作业任务调度&#xff0c;Executor作为slave负责实际执行任务。 核心组件 Driver&#xff1a;执行Spark任务的main方法&#xff0c;将用户程序转化为作业&#xff0c;在Executor间调度任务&…

安全是基石

“安全是基石”这句话强调了安全在个人、企业、社会等各个层面中的基础性和不可替代的重要性。无论是物理安全、网络安全、数据安全&#xff0c;还是生产安全、公共安全&#xff0c;都是保障稳定发展的前提。以下是不同领域中“安全”作为基石的体现&#xff1a; 1. 个人安全 基…

Linux Makefile-概述、语句格式、编写规则、多文件编程、Makefile变量分类:自定义变量、预定义变量

目录 1.make 1.1 make 命令格式 2.Makefile 核心概念‌ ‌ 2.1创建并运行 Makefile步骤 3. Makefile编写 3.1最基础Makefile 3.1.1使用默认make命令 3.1.2使用make -f 命令 3.1.2.1 使用make -f 命令执行默认make操作 3.1.2.2使用 make [ ‐f file ] [ targets ]命令 …

城市应急安防系统EasyCVR视频融合平台:如何实现多源视频资源高效汇聚与应急指挥协同

一、方案背景 1&#xff09;项目背景 在当今数字化时代&#xff0c;随着信息技术的飞速发展&#xff0c;视频监控和应急指挥系统在公共安全、城市应急等领域的重要性日益凸显。尤其是在关键场所&#xff0c;高效的视频资源整合与传输能力对于应对突发公共事件、实现快速精准的…

双Token实现用户登录身份认证-Java版

双Token实现用户登录身份认证-Java版 1. 设计方案 方案概述: Access Token: 短期有效的JWT,包含用户ID、设备ID、token版本号。Refresh Token: 长期有效的令牌,存储于Redis,关联用户信息、设备ID及token版本号,用于刷新Access Token。设备绑定: Token与设备ID绑定,防止跨…