路由缓存问题 | vue-router的导航守卫

路由缓存问题

        带参路由,当参数发生变化时,相同的组件实例将被复用,组件的生命周期钩子不会被调用,导致数据无法更新

两种解决方法:

1. 给 RouterView绑定key值,即

<RouterView :key="$route.fullPath" />

特点:不复用,破坏组件缓存,强制执行,存在一定的浪费,即 会重复请求数据。如,

2.  使用 onBeforeRouteUpdate 导航钩子(导航守卫)会在每次路由更新之前执行,在回调中执行数据更新的业务逻辑即可。

// 1. 导入钩子
import { onBeforeRouteUpdate } from 'vue-router'// 2. 使用钩子,路由参数变化时,把数据接口重新发送
//     to 目标路由 
onBeforeRouteUpdate((to)=>{// 更新接口业务逻辑
})

特点:精细化控制,性能较好。如, 

导航解析流程

  1. 导航被触发。
  2. 在失活的组件里调用离开守卫
  3. 调用全局的 beforeEach 守卫
  4. 重用的组件里调用 beforeRouteUpdate 守卫 (2.2+)。
  5. 路由配置里调用 beforeEnter
  6. 解析异步路由组件。
  7. 在被激活的组件里调用 beforeRouteEnter
  8. 调用全局的 beforeResolve 守卫 (2.5+)。
  9. 导航被确认。
  10. 调用全局的 afterEach 钩子
  11. 触发 DOM 更新。
  12. 用创建好的实例调用 beforeRouteEnter 守卫中传给 next 的回调函数。

 

导航守卫

vue-router 提供的,用于通过 跳转/取消 守卫导航。

参数/查询的改变 并不会触发进入/离开的导航守卫。可以通过观察 $route对象 来应对变化,或使用 BeforeRouteUpdate 的组件内守卫。

参数:

- to 目标路由

- from 离开的路由

- next 函数,用于调用来resolve这个钩子

路由导航种类:

- 全局前置守卫 router.beforeEach

导航 触发时,守卫 按照创建顺序调用。守卫是异步解析执行,此时 导航在所有守卫resolve完之前按一直是处于等待中。--》执行顺序:守卫->导航

const router = new VueRouter({ ... })router.beforeEach((to, from, next) => {// ...
})

- 全局解析守卫 router.beforeResolve(2.5.0新增)

导航被确认之前,同时在所有组件内 守卫和 异步路由组件被解析之后,解析守卫就被调用

 - 全局后置钩子 route.afterEach

不接受 next函数,且不改变导航本身。

router.afterEach((to, from) => {// ...
})

- 单个路由独享 beforeEnter

在路由配置中 定义 beforeEnter 守卫。

const router = new VueRouter({routes: [{path: '/foo',component: Foo,beforeEnter: (to, from, next) => {// ...}}]
})

- 组件级 beforeRouteEnter、beforeRouteUpdate(2.2新增)、beforeRouteLeave

组件内 定义路由导航守卫。

  • 确认守卫 beforeRouteEnter,守卫在导航确认前被调用,新组件尚未创建,即无法访问 this,只有它支持给next传递回调。
  • 更新守卫beforeRouteUpdate,守卫在当前路由改变,但组件被复用时,用于更新(新路由重调接口)
  • 离开守卫 beforeRouteLeave,用于禁止在还未保存修改前突然离开。可通过 next(false) 来取消。
beforeRouteLeave (to, from , next) {const answer = window.confirm('Do you really want to leave? you have unsaved changes!')if (answer) {next()} else {next(false)}
}
const Foo = {template: `...`,beforeRouteEnter (to, from, next) {next(vm => {})// 在渲染该组件的对应路由被 confirm 前调用// 不!能!获取组件实例 `this`// 因为当守卫执行前,组件实例还没被创建},beforeRouteUpdate (to, from, next) {// 在当前路由改变,但是该组件被复用时调用// 举例来说,对于一个带有动态参数的路径 /foo/:id,在 /foo/1 和 /foo/2 之间跳转的时候,// 由于会渲染同样的 Foo 组件,因此组件实例会被复用。而这个钩子就会在这个情况下被调用。// 可以访问组件实例 `this`},beforeRouteLeave (to, from, next) {// 导航离开该组件的对应路由时调用// 可以访问组件实例 `this`}
}

参考:导航守卫 | Vue Router

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

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

相关文章

软件测试中的43个功能测试点总结

功能测试就是对产品的各功能进行验证&#xff0c;根据功能测试用例&#xff0c;逐项测试&#xff0c;检查产品是否达到用户要求的功能。针对web系统的常用测试方法如下&#xff1a; 1、页面链接检查&#xff1a; 每一个链接是否都有对应的页面&#xff0c;并且页面之间切换正…

计算机竞赛 基于深度学习的人脸表情识别

文章目录 0 前言1 技术介绍1.1 技术概括1.2 目前表情识别实现技术 2 实现效果3 深度学习表情识别实现过程3.1 网络架构3.2 数据3.3 实现流程3.4 部分实现代码 4 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于深度学习的人脸表情识别 该项目较…

C#使用proto

写多了go代码&#xff0c;被go mod tidy惯坏了&#xff0c;还以为全天下的都很好用呢&#xff0c;结果发现并不是这样。尤其是项目组的proto还是又封了个工具直接就能跑得&#xff0c;导致以为没那么复杂的事情变得复杂了起来。是有两套生成的规则&#xff0c;时间有点晚&#…

Leetcode 1572.矩阵对角线元素之和

给你一个正方形矩阵 mat&#xff0c;请你返回矩阵对角线元素的和。 请你返回在矩阵主对角线上的元素和副对角线上且不在主对角线上元素的和。 示例 1&#xff1a; 输入&#xff1a;mat [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;25 解释&#xff1a;对角线的和为&#xff…

Boost电路实战详解!(高效率同步整流,PID闭环追踪)

文章目录 寄语什么是BOOST电路BOOST同步升压电路设计要求设计方案驱动电路电压采样电路 总体电路代码实物图总结 寄语 提示&#xff1a;若想实战演练&#xff0c;请先熟悉文章操作流程哦&#xff0c;不然会有危险&#xff01;&#xff01; 我建了一个群&#xff0c;分享我个人…

Hadoop生态圈中的Hive数据仓库技术

Hadoop生态圈中的Hive数据仓库技术 一、Hive数据仓库的基本概念二、Hive的架构组成三、Hive和数据库的区别四、Hive的安装部署五、Hive的基本使用六、Hive的元数据库的配置问题七、Hive的相关配置项八、Hive的基本使用方式1、Hive的命令行客户端的使用2、使用hiveserver2方法操…

Inno Setup 打包的文件以管理员权限运行

在 Inno Setup 安装目录中找到文件 SetupLdr.e32&#xff0c;用软件 ResourceHacker 打开。如下图&#xff0c;点开清单&#xff0c;找到 <requestedExecutionLevel level"asInvoker" uiAccess"false"/></requestedPrivileges>改为 <requ…

hadoop-MapReduce

分布式计算模型MapReduce 1.理解MapReduce设计思想 2.理解MapReduce分布式计算的基本原理 3.掌握使用Java进行MapReduce编程 4.掌握在Hadoop集群中提交MapReduce任务 1. MapReduce设计思想 1.1 什么是MapReduce 1&#xff09;MapReduce是一个分布式计算框架 它将大型数据操作…

【MySQL】数据库基础知识

本文基于Linux的MySQL 文章目录 一. 什么是数据库二. 主流数据库三. 服务器&#xff0c;数据库和表的关系四. MySQL架构五. SQL语句分类结束语 一. 什么是数据库 数据库本质是对数据内容存储的一套解决方案 如何理解呢&#xff1f; 首先&#xff0c;说到数据内容存储&#xff…

解决防火墙导致虚拟机不能ping通宿主机的问题

今天&#xff0c;无缘无故的&#xff0c;虚拟机突然用不了&#xff0c;网络连上不了&#xff0c;一番折腾翻找&#xff0c;最后才发现&#xff0c;是因为虚拟机ping不同宿主主机了&#xff0c;连网关都ping不通了&#xff0c;但是&#xff0c;宿主主机却可以ping通虚拟机 。 最…

element-ui dialog弹窗 设置点击空白处不关闭

根据官网提供方法 场景&#xff1a;vue实现的网站有两个弹窗同时出现时&#xff0c;关闭报警&#xff0c;批量进度条弹窗也关闭了&#xff0c; 1、每一个页面都有可能出现的报警弹窗&#xff0c; 2、页面a批量操控硬件添加操作的进度条弹窗 开始以为是因为点击报警弹窗&#…

高效数据湖构建与数据仓库融合:大规模数据架构最佳实践

文章目录 数据湖和数据仓库&#xff1a;两大不同理念数据湖数据仓库 数据湖与数据仓库的融合统一数据目录数据清洗和转换数据安全和权限控制数据分析和可视化 数据湖与数据仓库融合的优势未来趋势云原生数据湖自动化数据处理边缘计算与数据湖融合 结论 &#x1f389;欢迎来到云…

利用python进行视频下载并界面播放快速下载素材

工具&#xff1a;python designer&#xff08;python自带&#xff09;:UI界面设计工具 VLC&#xff1a;视频播放工具 需要的库如下&#xff1a; import os,platform os.environ[PYTHON_VLC_MODULE_PATH] "./vlc-3.0.14" import vlc from 脚本 import Player from …

STM32 硬件IIC 控制OLED I2C卡死问题

#更新通知&#xff1a;2023-09-06 STM32L151 固件库 使用I2C 太难了&#xff0c;又宕机了&#xff0c;建议不要在固件库版本上尝试硬件IIC 了&#xff0c;一般人真用不了&#xff0c;直接使用软件模拟的&#xff0c;或者不要使用固件库了&#xff0c;用HAL 库吧&#xff0c;据说…

APP启动优化Android篇

背景 为什么重提启动优化&#xff1f;首先&#xff0c;用户进入APP唯一的路径就是启动&#xff0c;这是体验核心链路的第一环。启动分为冷启动、热启动和温启动&#xff0c;本文中「启动」一词如果没有特别说明&#xff0c;均为冷启动。启动时间过长&#xff0c;会造成用户流失…

C++内存泄露

目录 1.什么是内存泄露 2.内存泄露的危害 3.如何解决内存泄露等相关的问题 1.什么是内存泄露 在C/C中 &#xff0c;我们申请了资源&#xff0c;因为一些原因忘记对申请的资源进行释放&#xff0c;或者因为异常安全等问题没有进行释放就会造成内存泄露的。 2.内存泄露的危害…

【好书推荐】《速学Linux:系统应用从入门到精通》

目录 前言一、为什么学习Linux系统二、Linux系统的应用领域&#xff11;.Linux在服务器的应用&#xff12;.嵌入式Linux的应用&#xff13;.桌面Linux的应用 三、Linux的版本选择1、经验人士使用的Debian2、以桌面应用为主的Ubuntu3、以经典桌面配置为主的Mint4、社区企业操作系…

【Docker】用Dockerfile制作个人的镜像文件

作者简介&#xff1a; 辭七七&#xff0c;目前大一&#xff0c;正在学习C/C&#xff0c;Java&#xff0c;Python等 作者主页&#xff1a; 七七的个人主页 文章收录专栏&#xff1a; 七七的闲谈 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01;&#x1f496;&#x1f…

《DevOps实践指南》- 读书笔记(一)

DevOps实践指南 Part 1 DevOps 介绍精益运动敏捷宣言 1. 敏捷、持续交付和三步法1.1 制造业价值流1.2 技术价值流1.2.1 聚焦于部署前置时间1.2.2 关注返工指标——%C/A 1.3 三步工作法&#xff1a;DevOps 的基础原则 2. 第一步&#xff1a;流动原则2.1 使工作可见2.2 限制制品数…

力扣|找出和所对应的两数的下标

从零开始刷力扣&#xff08;bushi 题目放在这&#xff1a; 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出和为目标值target的两个整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一…