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

news2024/9/21 8:01:48

个人名片
在这里插入图片描述
🎓作者简介: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 的开发技巧与经验!

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

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

相关文章

爬虫--翻页tips

免责声明&#xff1a;本文仅做分享&#xff01; 伪线程 from DrissionPage import ChromiumPage import timepage ChromiumPage() page.get("https://you.ctrip.com/sight/taian746.html") # 初始化 第0页 index_page 0# 翻页点击函数 sleep def page_turn():page…

【Linux修行路】网络套接字编程——UDP

目录 ⛳️推荐 前言 六、Udp Server 端代码 6.1 socket——创建套接字 6.2 bind——将套接字与一个 IP 和端口号进行绑定 6.3 recvfrom——从服务器的套接字里读取数据 6.4 sendto——向指定套接字中发送数据 6.5 绑定 ip 和端口号时的注意事项 6.5.1 云服务器禁止直接…

C++复习day12

IO流 一、C语言的输入和输出 C语言中我们用到的最频繁的输入输出方式就是scanf ()与printf()。 scanf(): 从标准输入设备(键 盘)读取数据&#xff0c;并将值存放在变量中。printf(): 将指定的文字/字符串输出到标准输出设备(屏幕)。 注意宽度输出和精度输出控制。C语言借助了…

【C++】多态and多态原理

目录 一、多态的概念 二、多态的定义及实现 &#x1f31f;多态的构成条件 &#x1f31f;虚函数 &#x1f31f;虚函数的重写 &#x1f320;小贴士&#xff1a; &#x1f31f;C11 override 和 final &#x1f31f;重载、重写&#xff08;覆盖&#xff09;、重定义&#xf…

POD内的容器之间的资源共享

概述 摘要&#xff1a;本文通过实践描述并验证了pod内容器如何实现网络、文件、PID、UTC、mount的共享。 pod实战之容器内资源共享与隔离 container容器之间的共享实战 从实际场景说起&#xff1a;有2个容器nginx与wordpress分别运行了紧密耦合且需要共享资源的应用程序。我…

英语学习交流平台|基于java的英语学习交流平台系统小程序(源码+数据库+文档)

英语学习交流平台系统小程序 目录 基于java的英语学习交流平台系统小程序 一、前言 二、系统设计 三、系统功能设计 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大厂码农|毕设布道师&…

基于SpringBoot的校园社团活动管理系统设计与实现

文未可获取一份本项目的java源码和数据库参考。 一、设计&#xff08;论文&#xff09;研究背景与意义 在当今的社会&#xff0c;可以说是信息技术的发展时代&#xff0c;在社会的方方面面无不涉及到各种信息的处理。[1]信息是人们对客观世界的具体描述&#xff0c;是人们进行…

性能优化一:oracle 锁的原则

文章目录 锁的原则查看具体会话阻塞过程 锁的原则 1、只有被修改时,行才会被锁定。 2、当条语句修改了一条记录,只有这条记录上被锁定,在Oracle数据库中不存在锁升 3、当某行被修改时 &#xff0c;它将阻塞别人对它的修改。 4、当一个事务修改一行时.将在这个行上加上行锁(TX…

测试开发基础——测试用例的设计

三、测试用例的设计 1. 什么是测试用例 测试用例(Test Case)是为了实施测试而向被测试的系统提供的一组集合&#xff0c;这组集合包含&#xff1a;测试环境、操作步骤、测试数据、预期结果等要素。 设计测试用例原则一&#xff1a;测试用例中一个必需部分是对预期输出或结果进…

带你如何使用CICD持续集成与持续交付

目录 一、CICD是什么 1.1 持续集成&#xff08;Continuous Integration&#xff09; 1.2 持续部署&#xff08;Continuous Deployment&#xff09; 1.3 持续交付&#xff08;Continuous Delivery&#xff09; 二、git工具使用 2.1 git简介 2.2 git的工作流程 2.3 部署g…

【MRI基础】Partial volume 伪影

基本概念 partial volume 伪影是 MRI 中的一种常见伪影&#xff0c;当图像中的体素包含不同组织类型或结构的混合时就会出现这种伪影。这种伪影是由于成像系统的空间分辨率有限而产生的&#xff0c;导致具有不同信号强度的相邻结构在一个体素内混合在一起。 抑制MRI 中的parti…

图数据库的力量:深入理解与应用 Neo4j

图数据库的力量&#xff1a;深入理解与应用 Neo4j 文章目录 图数据库的力量&#xff1a;深入理解与应用 Neo4j1、什么是 Neo4j&#xff1f;版本说明 2、Neo4j 的部署和安装Neo4j Web 工具介绍 3、体验 Neo4j加载数据查询数据数据结构 4、Cypher 入门创建数据查询数据关系深度查…

Matlab simulink建模与仿真 第十五章(信号源库)

参考视频&#xff1a;simulink1.1simulink简介_哔哩哔哩_bilibili 一、信号源库中的模块概览 注&#xff1a;部分模块在第二章中有介绍&#xff0c;本章不再赘述。 二、from输入源模块 1、From Workspace模块 &#xff08;1&#xff09;该模块可从MATLAB工作区、模型工作区…

JVM 运行时数据区域

目录 前言 程序计数器 java虚拟机栈 本地方法栈 java堆 方法区 运行时常量池 前言 首先, java程序在被加载在内存中运行的时候, 会把他自己管理的内存划分为若干个不同的数据区域, 就比如你是一个你是一个快递员, 一堆快递过来需要你分拣, 这个时候, 你就需要根据投放的目…

数据稀缺条件下的时间序列微分:符号回归(Symbolic Regression)方法介绍与Python示例

时间序列概况在日常生活和专业研究中都很常见。简而言之,时间序列概况是一系列连续的数据点 y(0), y(1), …, y(t) ,其中时间 t 的点依赖于时间 t-1 的前一个点(或更早的时间点)。 在许多应用中,研究者致力于预测时间序列概况的未来行为。存在各种建模方法。这些模型通常基于过…

Django学习实战篇四(适合略有基础的新手小白学习)(从0开发项目)

前言&#xff1a; 在本章中&#xff0c;我们开始编写面向用户的界面&#xff0c;其中只涉及简单的HTML结构&#xff0c;不会做太多美化&#xff0c;目的就是把后台创建的数据展示到前台。 从技术上来讲&#xff0c;这一节将涉及Django 中function view和 class-based view 的用…

用Python实现时间序列模型实战——Day 22: LSTM 与 RNN 模型

一、学习内容 1. 长短期记忆网络 (LSTM) 的原理 LSTM&#xff08;长短期记忆网络&#xff09; 是一种专门用于处理时间序列数据的神经网络&#xff0c;它克服了传统 RNN 在处理长序列时出现的梯度消失问题。LSTM 通过引入 记忆单元 和 门控机制&#xff08;输入门、遗忘门、输…

Ruffle 继续在开源软件中支持 Adobe Flash Player

大多数人已经无需考虑对早已寿终正寝的 Adobe Flash 的支持&#xff0c;但对于那些仍有一些 Adobe Flash/SWF 格式的旧资产&#xff0c;或想重温一些基于 Flash 的旧游戏/娱乐项目的人来说&#xff0c;开源 Ruffle 项目仍是 2024 年及以后处理 Flash 的主要竞争者之一。 Ruffl…

【Hot100】LeetCode—4. 寻找两个正序数组的中位数

目录 1- 思路题目识别二分 2- 实现⭐4. 寻找两个正序数组的中位数——题解思路 3- ACM 实现 原题链接&#xff1a;4. 寻找两个正序数组的中位数 1- 思路 题目识别 识别1 &#xff1a;给定两个数组 nums1 和 nums2 &#xff0c;找出数组的中位数 二分 思路 将寻找中位数 —…

Python数据分析案例59——基于图神经网络的反欺诈交易检测(GCN,GAT,GIN)

以前的数据分析案例的文章可以参考&#xff1a;数据分析案例 案例背景 以前二维的表格数据的机器学习模型都做烂了&#xff0c;[线性回归,惩罚回归,K近邻,决策树,随机森林,梯度提升,支持向量机,神经网络]&#xff0c;还有现在常用的XGBoost&#xff0c;lightgbm&#xff0c;ca…