Vue.js入门系列(二十九):深入理解编程式路由导航、路由组件缓存与路由守卫

个人名片
在这里插入图片描述
🎓作者简介:java领域优质创作者
🌐个人主页:码农阿豪
📞工作室:新空间代码工作室(提供各种软件服务)
💌个人邮箱:[2435024119@qq.com]
📱个人微信:15279484656
🌐个人导航网站:www.forff.top
💡座右铭:总有人要赢。为什么不能是我呢?

  • 专栏导航:

码农阿豪系列专栏导航
面试专栏:收集了java相关高频面试题,面试实战总结🍻🎉🖥️
Spring5系列专栏:整理了Spring5重要知识点与实战演练,有案例可直接使用🚀🔧💻
Redis专栏:Redis从零到一学习分享,经验总结,案例实战💐📝💡
全栈系列专栏:海纳百川有容乃大,可能你想要的东西里面都有🤸🌱🚀

目录

      • Vue.js入门系列(二十九):深入理解编程式路由导航、路由组件缓存与路由守卫
        • 引言
      • 一、编程式路由导航
        • 1.1 什么是编程式路由导航?
        • 1.2 基本用法
        • 1.3 `replace`与`push`的区别
      • 二、缓存路由组件
        • 2.1 什么是路由组件缓存?
        • 2.2 使用`<keep-alive>`缓存组件
        • 2.3 控制缓存的组件
      • 三、两个新的生命周期钩子
        • 3.1 `activated`与`deactivated`钩子
      • 四、全局前置路由守卫
        • 4.1 什么是路由守卫?
        • 4.2 定义全局前置守卫
        • 4.3 `next`函数
      • 五、全局后置路由守卫
        • 5.1 定义全局后置守卫
      • 六、总结

Vue.js入门系列(二十九):深入理解编程式路由导航、路由组件缓存与路由守卫

引言

在Vue.js应用中,Vue Router提供了强大的路由管理功能,支持多种导航方式、组件缓存和生命周期钩子,以及全局路由守卫。这些功能对于构建复杂应用至关重要。在本文中,我们将详细探讨编程式路由导航、路由组件缓存、两个新的生命周期钩子,以及全局前置和后置路由守卫的使用。


一、编程式路由导航

1.1 什么是编程式路由导航?

编程式路由导航是指使用JavaScript代码通过Vue Router进行导航,而不是依赖于模板中的<router-link>。这种方式提供了更大的灵活性,允许我们在代码逻辑中控制路由的跳转。

1.2 基本用法

Vue Router 提供了this.$router.push()this.$router.replace()方法,用于在代码中执行路由导航。

// 导航到指定路径
this.$router.push('/about');

// 使用命名路由
this.$router.push({ name: 'user', params: { id: 123 } });

// 带查询参数的导航
this.$router.push({ path: '/search', query: { q: 'Vue.js' } });
1.3 replacepush的区别

replacepush 的主要区别在于历史记录的处理方式:

  • push 会在浏览器历史记录中添加一个新的记录。
  • replace 则会替换当前的历史记录。
// 替换当前的路由
this.$router.replace({ name: 'home' });

replace通常用于需要覆盖当前页面而不想让用户回到前一页面的场景中。


二、缓存路由组件

2.1 什么是路由组件缓存?

在某些场景下,我们希望路由组件在被切换出去时不被销毁,再次切换回来时能够保留其状态。Vue 提供了<keep-alive>组件用于缓存这些路由组件。

2.2 使用<keep-alive>缓存组件

通过在<router-view>外层包裹<keep-alive>组件,我们可以实现路由组件的缓存。

<template>
  <div id="app">
    <router-link to="/home">Home</router-link>
    <router-link to="/about">About</router-link>
    <keep-alive>
      <router-view></router-view>
    </keep-alive>
  </div>
</template>

在这个示例中,/home/about两个路由对应的组件在被切换出去时不会被销毁,当用户返回时,这些组件会保留之前的状态。

2.3 控制缓存的组件

可以通过组件的name属性和<keep-alive>includeexclude属性来精确控制哪些组件需要被缓存。

<keep-alive include="home">
  <router-view></router-view>
</keep-alive>

在这个例子中,只有名称为home的组件会被缓存,其他组件不会。


三、两个新的生命周期钩子

3.1 activateddeactivated钩子

在使用<keep-alive>缓存组件时,Vue 提供了两个新的生命周期钩子来处理组件的激活与停用:

  • activated:当组件从缓存中激活时调用。
  • deactivated:当组件被缓存时调用,而不是被销毁。
export default {
  data() {
    return {
      message: 'Hello'
    };
  },
  activated() {
    console.log('Component activated');
  },
  deactivated() {
    console.log('Component deactivated');
  }
};

这些钩子非常适合在组件需要在激活或停用时执行特定逻辑的场景,如重新加载数据或暂停动画。


四、全局前置路由守卫

4.1 什么是路由守卫?

路由守卫是 Vue Router 提供的一种机制,它允许我们在路由导航发生之前或之后执行一些逻辑,比如权限验证、日志记录或数据预加载。

4.2 定义全局前置守卫

全局前置守卫通过router.beforeEach方法定义,它会在每次路由导航开始时触发。

const router = new VueRouter({ ... });

router.beforeEach((to, from, next) => {
  console.log('Global Before Each');
  // 执行一些逻辑,例如权限验证
  if (to.meta.requiresAuth && !isAuthenticated()) {
    next('/login'); // 重定向到登录页面
  } else {
    next(); // 继续导航
  }
});

在这个例子中,守卫检查目标路由是否需要认证,如果需要且用户未认证,则重定向到登录页面,否则继续导航。

4.3 next函数

在路由守卫中,next函数非常重要,它决定了导航的行为:

  • next():继续导航。
  • next(false):中断当前的导航。
  • next('/path'):跳转到一个新的路径。
  • next(new Error('error message')):导航终止,并且会传递一个错误给router.onError()

五、全局后置路由守卫

5.1 定义全局后置守卫

全局后置守卫通过router.afterEach方法定义,它在每次路由导航结束时触发。

router.afterEach((to, from) => {
  console.log('Global After Each');
  // 例如,记录页面访问日志
});

与前置守卫不同,后置守卫不接受next参数,也不会影响导航的进行。它通常用于执行一些与导航结束后相关的逻辑,如记录页面访问、修改页面标题等。


六、总结

通过本文的学习,你应该掌握了以下关键点:

  • 编程式路由导航:理解了如何使用pushreplace方法在代码中进行路由导航,并掌握了replace的应用场景。
  • 缓存路由组件:学会了使用<keep-alive>组件缓存路由组件,理解了activateddeactivated生命周期钩子的作用。
  • 全局前置路由守卫:掌握了如何使用beforeEach方法定义全局前置守卫,并在导航开始时执行权限验证或其他逻辑。
  • 全局后置路由守卫:了解了如何使用afterEach方法定义全局后置守卫,在导航结束后执行页面日志记录等操作。

这些功能为 Vue.js 应用的路由管理提供了更大的灵活性和控制能力,使得我们能够构建更加复杂和健壮的单页应用。在接下来的博客中,我们将继续深入探讨 Vue Router 的其他高级功能和实际应用场景。如果你有任何疑问或需要进一步讨论,欢迎在评论区留言。感谢你的阅读,期待在下一篇博客中继续与大家分享更多 Vue.js 和 Vue Router 的开发技巧与经验!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

解锁编程潜力,从掌握GitHub开始

目录&#xff1a; 一、搜索开源项目 1、什么是Git 2、Github常用词含义 3、一个完整的项目界面 4、使用Github搜索项目 1&#xff09;in关键词 2&#xff09;star或fork数量去查找 3&#xff09;awesome加强搜索 二、访问速度慢的解决 1、使用网易UU加速器 2、使用…

Visual Studio(vs)下载安装C/C++运行环境配置和基本使用注意事项

基本安装 点击跳转到vs官网点击箭头所指的按钮进行下载双击运行刚才下载好的下载器点击继续勾选“使用C的桌面开发”和“Visual Studio扩展开发”点击“安装位置”&#xff0c;对vs的安装位置进行更改。你可以跟我一样只选择D盘或者其他你空闲的盘&#xff0c;然后将默认的路径…

响应式CSS 媒体查询——WEB开发系列39

CSS媒体查询&#xff08;Media Queries&#xff09;是响应式设计中的核心技术之一&#xff0c;帮助我们在不同设备上展示不同的样式。通过媒体查询&#xff0c;开发者可以检测用户设备的特性&#xff0c;如屏幕宽度、高度、分辨率、方向等&#xff0c;针对性地调整网页布局。 一…

架构师知识梳理(七):软件工程-工程管理与开发模型

软件工程概述 软件开发生命周期 软件定义时期&#xff1a;包括可行性研究和详细需求分析过程&#xff0c;任务是确定软件开发工程必须完成的总目标&#xff0c;具体可分成问题定义、可行性研究、需求分析等。软件开发时期&#xff1a;就是软件的设计与实现&#xff0c;可分成…

气压测试实验(用IIC)

I2C: 如果没有I2c这类总线&#xff0c;连接方法可能会如下图&#xff1a; 单片机所有的通讯协议&#xff0c;无非是建立在引脚&#xff08;高低电平的变换高低电平持续的时间&#xff09;这二者的组合上&#xff0c;i2c 多了一个clock线&#xff0c;负责为数据传输打节拍。 (i2…

如何删除git提交记录

今天在提交github时&#xff0c;不小心提交了敏感信息&#xff0c; 不要问我提交了啥&#xff0c;问就是不知道 查了下资料&#xff0c;终于找到简单粗暴的方式来删除提交记录。方法如下 git reset --soft HEAD~i i代表要恢复到多少次提交前的状态&#xff0c;如指定i 2&…

一文读懂:如何将广告融入大型语言模型(LLM)输出

本文是我翻译过来的&#xff0c;讨论了在线广告行业的现状以及如何将大型语言模型&#xff08;LLM&#xff09;应用于在线广告。 原文请参见”阅读原文“。 在2024年&#xff0c;预计全球媒体广告支出的69%将流向数字广告市场。这个数字预计到2029年将增长到79%。在Meta的2024…

微服务——网关路由(Spring Cloud Gateway)

网关路由 1.什么是网关 网关又称网间连接器、协议转换器&#xff0c;是在网络层以上实现网络互连的复杂设备&#xff0c;主要用于两个高层协议不同的网络之间的互连。网关就是网络的关口。数据在网络间传输&#xff0c;从一个网络传输到另一网络时就需要经过网关来做数据的路由…

Kafka 基础与架构理解

目录 前言 Kafka 基础概念 消息队列简介&#xff1a;Kafka 与传统消息队列&#xff08;如 RabbitMQ、ActiveMQ&#xff09;的对比 Kafka 的组件 Kafka 的工作原理&#xff1a;消息的生产、分发、消费流程 Kafka 系统架构 Kafka 的分布式架构设计 Leader-Follower 机制与…

安卓玩机工具-----无需root权限 卸载 禁用 删除当前机型app应用 ADB玩机工具

ADB玩机工具 ADB AppControl是很实用的安卓手机应用管理工具&#xff0c;无需root权限&#xff0c;通过usb连接电脑后&#xff0c;可以很方便的进行应用程序安装与卸载&#xff0c;还支持提取手机应用apk文件到电脑上&#xff0c;此外还有手机系统垃圾清理、上传文件等…

VMware Workstation Player虚拟机Ubuntu启用Windows共享目录

1、新建共享目录 2、安装并启用vmtools、fuse sudo apt update sudo apt install open-vm-tools open-vm-tools-desktop sudo apt install fuse sudo systemctl start open-vm-tools sudo systemctl enable open-vm-tools 3、命令挂载 sudo vmhgfs-fuse .host:/SharedFold…

初学Linux(学习笔记)

初学Linux&#xff08;学习笔记&#xff09; 前言 本文跳过了Linux前期的环境准备&#xff0c;直接从知识点和指令开始。 知识点&#xff1a; 1.目录文件夹&#xff08;Windows&#xff09; 2.文件内容属性 3.在Windows当中区分文件类型是通过后缀&#xff0c;而Linux是通过…

leaflet【十】实时增加轨迹点轨迹回放效果实现

实时轨迹回放 在前面有用leaflet-trackplayer实现了一个轨迹回放的效果&#xff0c;单击前往&#xff1a;轨迹回放效果&控制台控制轨迹运动效果 这篇文章主要是实现一下实时增加轨迹点&#xff0c;不改变原来运行轨迹和速度。这里是简易做了一个demo效果&#xff0c;大概…

vue3透传、注入

属性透传 传递给子组件时&#xff0c;没有被子组件消费的属性或事件&#xff0c;常见的如id、class 注意1 1.class、style是合并的&#xff0c;style中如果出现重复的样式&#xff0c;以透传属性为准2.id属性是以透传属性为准&#xff0c;其他情况透传属性名相同&#xff0c…

【AI视频】复刻抖音爆款AI数字人作品初体验

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AI视频 | AI数字人 文章目录 &#x1f4af;前言&#x1f4af;抖音上的爆火AI数字人视频&#x1f4af;注册HeyGen账号&#x1f4af;复刻抖音爆款AI数字人&#x1f4af;最终生成效果&#x1f4af;小结 对比原视频效果&#xff1a;…

【算法篇】哈希类(笔记)

目录 一、常见的三种哈希结构 二、LeetCode 练习 1. 有效的字母异位词 2. 两个数组的交集 3. 快乐数 4. 两数之和 5. 四数相加II 6. 赎金信 7. 三数之和 8. 四数之和 一、常见的三种哈希结构 当想使用哈希法来解决问题的时候&#xff0c;一般会选择如下三种数据…

Java--String类

前言&#xff1a; 在之前的学习中&#xff0c;学习了和了解了一些类的基本使用&#xff0c;例如object类等等&#xff0c;但是我们用String这个引用或者说这个类其实我们已经用了好久&#xff0c;只不过没有具体分析过&#xff01; 对于String类&#xff0c;它可以引用一个字符…

JavaScript web API part3

web API DOM 日期对象 > 得到当前系统的时间 new这个操作就是实例化 语法 const date new Date() or const date new Date(2004-11-3 08:00:00) 可以指定时间 > 可应用于通过系统时间和指定时间实现倒计时的操作 //得到当前时间const date new Date()console.lo…

【Python小知识 - 2】:在VSCode中切换Python解释器版本

文章目录 在VSCode中切换Python解释器版本 在VSCode中切换Python解释器版本 在VSCode中按下快捷键CtrlShiftP&#xff0c;出现命令框。 输入以下命令&#xff1a; Python: Select Interpreter输入命令回车后即出现不同的Python解释器选项&#xff0c;选择想要切换的Python解释器…

【题解】—— LeetCode一周小结37

&#x1f31f;欢迎来到 我的博客 —— 探索技术的无限可能&#xff01; &#x1f31f;博客的简介&#xff08;文章目录&#xff09; 【题解】—— 每日一道题目栏 上接&#xff1a;【题解】—— LeetCode一周小结36 9.合并零之间的节点 题目链接&#xff1a;2181. 合并零之间…