vue router路由复用及刷新问题研究
路由复用问题
当路由匹配路径未发生变化时,只是相关的参数发生了变化,路由跳转时,会发现虽然地址栏中的地址更新到了新的链接,但是页面渲染并未触发响应路由组件的created
,mounted
等钩子函数,也就意味着组件并没有被重新创建,也就是路由复用问题。
在官方文档中,下面这段话同样体现了这个问题。
了解vue组件复用的应该知道,复用时并不会更新组件内部自身data中拥有的响应式属性,但是如果是通过props传递过来的属性,在复用组件时,进行diff patch时,是会更新的。具体组件复用更新原理不清楚的,可以参考博客组件复用
vue-router在匹配到对应的路由后,同样会更新对应组件的props参数,相关实现逻辑在router-view
组件的render函数中有体现,其中fillPropsinData
将路由表中的props参数传递给路由组件的props
var configProps = matched.props && matched.props[name];// save route and configProps in cacheif (configProps) {extend(cache[name], {route: route,configProps: configProps});fillPropsinData(component, data, route, configProps);}
具体怎么设置props呢?可以参考官方文档 路由组件传参
props参数复用更新
下面是一个简单的 detail.vue 示例,用于显示详情页面。假设我们通过路由参数 id 来获取并显示特定项的详细信息。
首先,确保你的路由配置中包含了 detail 路由,并且能够传递 id 参数。例如:
// router/index.js
import Vue from 'vue';
import Router from 'vue-router';
import List from '@/page/list.vue';
import Detail from '@/page/detail.vue';Vue.use(Router);export default new Router({routes: [{path: '/list',name: 'List',component: List},{path: '/detail/:id',name: 'Detail',component: Detail}]
});
下面是一个简单的 list.vue 示例,其中包含一个列表,列表项可以跳转到详情页面。假设详情页面的路由为 /detail/:id。
<template><div><ul><li v-for="item in list" :key="item.id" @click="goToDetail(item.id)">{{ item.name }}</li></ul></div>
</template><script>
export default {data() {return {list: [{ id: 1, name: 'Item 1' },{ id: 2, name: 'Item 2' },{ id: 3, name: 'Item 3' },// 更多列表项...]};},methods: {goToDetail(id) {this.$router.push({ path: `/detail/${id}` });}}
};
</script><style scoped>
ul {list-style-type: none;padding: 0;
}li {padding: 8px;cursor: pointer;border-bottom: 1px solid #ccc;
}li:hover {background-color: #f0f0f0;
}
</style>
接下来是 detail.vue 的代码:
<template><div><h1>Detail Page - {{id}} </h1><div v-if="item"><h2>{{ item.name }}</h2><p>ID: {{ item.id }}</p><p>Description: {{ item.description }}</p></div><div v-else><p>Loading...</p></div><button @click="goBack">Back to List</button><button @click="goToDetail">Go to other detail 2</button></div>
</template><script>
export default {props: ['id'],data() {return {item: null};},created() {this.fetchItem();},methods: {fetchItem() {const id = this.$route.params.id;// 假设我们有一个方法来获取数据,这里用模拟数据代替const items = [{ id: 1, name: 'Item 1', description: 'Description for Item 1' },{ id: 2, name: 'Item 2', description: 'Description for Item 2' },{ id: 3, name: 'Item 3', description: 'Description for Item 3' }];this.item = items.find(item => item.id === parseInt(id));},goBack() {this.$router.push({ name: 'List' });},goToDetail() {this.$router.replace({ name: 'Detail', params: { id: 2 } })}}
};
</script><style scoped>
h1 {font-size: 24px;margin-bottom: 20px;
}h2 {font-size: 20px;margin-bottom: 10px;
}p {margin: 5px 0;
}button {margin-top: 20px;padding: 10px 20px;background-color: #007bff;color: white;border: none;cursor: pointer;
}button:hover {background-color: #0056b3;
}
</style>
从列表跳转到详情页时,可以正常的更新渲染,但是可以到详情页之间互相跳转时,页面的渲染是有问题的。以上面为例,从detail page 3跳转到 detail page 2时,只更新了title 中的id,而对应的内容并没有更新。
从detail.vue的template中可以看到,组件中props中的id对应的渲染更新了,而item作为组件自身内部响应式并没有更新。因为item的赋值逻辑是在created里触发的,而详情页跳转详情页的情况,是不会触发created的。
渲染更新
如果想让详情页之间的跳转能够及时地更新,要如何做呢?也就是最初上面官网上介绍的,如何响应路由参数的变化?官方给出的方案有相中:
路由守卫
虽然相同路由之间跳转,不会触发created等钩子函数,但是会触发路由守卫函数beforeRouteUpdate
,可以考虑将原先的数据初始化逻辑放到这里。以上面的例子为例,可以在代码中加入下面的代码来触发页面的更新:
beforeRouteUpdate (to, from, next) {console.log('=====beforeRouteUpdate====',to.params.id, this.id)this.fetchItem(to.params.id)next()
}
//这里id改为传入的,以便上面方法中能够传入最新的路由参数
fetchItem(id) {// 假设我们有一个方法来获取数据,这里用模拟数据代替const items = [{ id: 1, name: 'Item 1', description: 'Description for Item 1' },{ id: 2, name: 'Item 2', description: 'Description for Item 2' },{ id: 3, name: 'Item 3', description: 'Description for Item 3' }];this.item = items.find(item => item.id === parseInt(id));}
这里需要注意使用的是beforeRouteUpdate
,而不是beforeRouteEnter
,经实际验证,beforeRouteEnter
只在从其他路由进入该路由时触发,而在像详情页跳转详情页这样的路由复用时,不会触发。
watch监听路由变化
官网给出的解决方法,除了路由守卫,就是监听$route
,加入下面的代码,同样可以达到对应的效果。
watch: {'$route' (to, from) {console.log('=====watch====',to.params.id, this.id)this.fetchItem(to.params.id)}},
打破路由复用
上面的两种方法虽然都能达到路由试图随参数变化而更新,但是本质上还是在复用的基础上,在合适的时机重新触发处理逻辑函数,已达到更新目的。由于是复用的实例,所以在更新时并不会主动销毁之前创建的资源,如果有销毁的需求,比如每次进入详情页都会创建一些canvas等,在路由参数发生变化时,需要重新绘制,通常是需要先销毁之前的,再重新绘制新的,而采用上面两种方法,在复用渲染时,需要我们手动去管理这些。
如果我们期望的是不管路由是不是从详情页跳转详情页复用,每次参数变化时,不复用之前的,销毁之前创建的组件实例,然后重新创建新的组件实例,要如何做呢?
使用 key
强制重新渲染,通过为组件设置一个唯一的 key,Vue 会认为这是一个不同的组件实例,从而强制重新渲染。
<template><router-view :key="$route.fullPath"></router-view>
</template>
上面直接在route-view上绑定key值,会影响所有的路由,如果只想针对详情页路由处理,可以直接在组件上使用 key:
<!-- 这里新建一个wrapper.vue 路由组件,修改路由表里的detail路由对应的组件为这个wrapper.vue组件 -->
<template><!-- Detail 组件 --><Detail v-bind="$attrs" :key="$route.params.id"></Detail>
</template>
注意上面直接在路由组件上绑定key值时,需将原有Detail路由组件作为新的路由组件的子组件。因为相同的路径对应的路由还是默认会走vue-router的组件复用逻辑,如果直接在原有的Detail组件内部绑定key值是起不到作用的,这里修改新的路由组件为wrapper.vue组件,复用时也是复用的wrapper组件,在对wrapper组件进行diff算法更新时,由于key值不同,会重新触发子组件的渲染,此时就会重新触发Detail组件的created
钩子函数,同时也会触发先前组件的beforeDestroy
钩子函数,销毁之前的实例。
相关文章:
vue router路由复用及刷新问题研究
路由复用问题 当路由匹配路径未发生变化时,只是相关的参数发生了变化,路由跳转时,会发现虽然地址栏中的地址更新到了新的链接,但是页面渲染并未触发响应路由组件的created,mounted等钩子函数,也就意味着组件并没有被重…...
XML实体注入漏洞攻与防
JAVA中的XXE攻防 回显型 无回显型 cve-2014-3574...
【论文阅读】RT-SKETCH: GOAL-CONDITIONED IMITATION LEARNING FROM HAND-DRAWN SKETCHES
RT-Sketch:基于手绘草图的目标条件模仿学习 摘要:在目标条件模仿学习(imitation learning,IL)中,自然语言和图像通常被用作目标表示。然而,自然语言可能存在歧义,图像则可能过于具体…...
27. 【.NET 8 实战--孢子记账--从单体到微服务】--简易报表--报表服务
报表是每个记账应用所具备的功能,要实现报表功能就需要把账本的核心功能(记账)完成,因此报表服务作为本专栏第一部分单体应用开发中最后一个要实现的功能,这一篇文章很简单,我们一起来实现一个简单的报表服…...
LeetCode - #194 Swift 实现文件内容转置
网罗开发 (小红书、快手、视频号同名) 大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等…...
【全栈】SprintBoot+vue3迷你商城(9)
【全栈】SprintBootvue3迷你商城(9) 往期的文章都在这里啦,大家有兴趣可以看一下 后端部分: 【全栈】SprintBootvue3迷你商城(1) 【全栈】SprintBootvue3迷你商城(2) 【全栈】Spr…...
ThreeJS示例教程200+【目录】
Three.js 是一个强大的 JavaScript 库,旨在简化在网页上创建和展示3D图形的过程。它基于 WebGL 技术,但提供了比直接使用 WebGL 更易于使用的API,使得开发者无需深入了解 WebGL 的复杂细节就能创建出高质量的3D内容。 由于目前内容还不多,下面的内容暂时做一个占位。 文章目…...
《边界感知的分而治之方法:基于扩散模型的无监督阴影去除解决方案》学习笔记
paper:Boundary-Aware Divide and Conquer: A Diffusion-Based Solution for Unsupervised Shadow Removal 目录 摘要 1、介绍 2、相关工作 2.1 阴影去除 2.2 去噪扩散概率模型(Denoising Diffusion Probabilistic Models, DDPM) 3、方…...
PyCharm+RobotFramework框架实现UDS自动化测试- (四)项目实战0x10
1.环境搭建 硬件环境:CANoe、待测设备(包含UDS诊断模块) 2.pythonPyCharm环境 pip install robotframework pip install robotframework-ride pip install openpyxl pip install udsoncan pip install python-can pip install can-isotp3…...
基于java实现规则引擎设计思路
背景 去年底换了公司,目前在做HR招聘系统,产品要求:管理端手动配置发布招聘要求(支持多个招聘条件AND与OR关系编排);当C端用户报名该职位时,系统执行该规则,返回报名成功或失败。根据技术调研,采用db存规则…...
TCP协议:互联网数据传输的守护者
在互联网的浩瀚海洋中,数据如同涓涓细流,无时无刻不在流动。而这些数据的稳定、可靠传输,离不开一个重要的协议——TCP(Transmission Control Protocol,传输控制协议)。TCP协议作为互联网协议族中的核心成员…...
2025美国大学生数学建模竞赛(美赛)B题完整思路分析论文(35页)(含模型、可运行代码和运行结果)
2025美国大学生数学建模竞赛B题完整思路分析论文 目录 摘要 一、问题重述 二、问题分析 三、模型假设 四、模型建立与求解 4.1问题1 4.1.1问题1思路分析 4.1.2问题1模型建立 4.1.3问题1样例代码(仅供参考) 4.1.4问题1样例代码运行结…...
InceptionV1_V2
目录 不同大小的感受野去提取特征 经典 Inception 网络的设计思路与运行流程 背景任务:图像分类(以 CIFAR-10 数据集为例) Inception 网络的设计思路 Inception 网络的运行流程 打个比方 多个损失函数的理解 1. 为什么需要多个损失函数&#…...
面向对象设计原则
面向对象最大的优势是抵御变化 理解隔离变化: 从宏观面来看,面向对象构建方式更能适应软件的变化,能将变化所带来的影响减为最少。 各司其职:从微观层面来看,面向对象的方式更强调各个类的责任。由于需求变化导致的新…...
近年流行的开发技术
Web 开发领域 前端技术 HTML5、CSS3 和 JavaScript HTML5:作为网页结构的基础,引入了新的语义化标签(如<header>、<nav>、<article>等),增强了网页的可读性和搜索引擎优化效果,同时支持…...
Go语言中的Select
Select 在 Go 语言中,select 是一种用于处理多个通道操作的控制结构。它允许你同时监听多个通道上的通信操作(发送或接收),并根据哪个操作先完成来执行相应的代码块。select 是 Go 并发编程中的一个重要工具,常用于实…...
SQL调优讨论
说明:狭义的SQL调优,指对慢SQL(一般是Select语句,或包含Select的语句)优化,在不改变查询结果的情况下提高SQL执行效率。广义上的SQL调优,指对某个慢查询优化,通过一些类操作提高查询…...
【STM32】-TTP223B触摸开关
前言 本文章旨在记录博主STM32的学习经验,我自身也在不断的学习当中,如果文章有写的不对的地方,欢迎各位大佬批评指正。 准备工作 今天这篇文章介绍的是触摸开关这一外围硬件。 ST-link调试器STM32最小系统板单路TTP223B触摸传感器模块LE…...
华为数据之道-读书笔记
内容简介 关键字 数字化生产 已经成为普遍的商业模式,其本质是以数据为处理对象,以ICT平台为生产工具,以软件为载体,以服务为目的的生产过程。 信息与通信技术平台(Information and Communication Technology Platf…...
Zookeeper(28)Zookeeper的线性化写入和顺序一致性读是什么?
Zookeeper 是一个分布式协调服务,它在设计上提供了强一致性的保证,其中包括线性化写入和顺序一致性读。这两种一致性模型确保了在分布式系统中数据的一致性和操作的确定性。 线性化写入(Linearizable Writes) 线性化写入保证在任…...
Ubuntu安装GitLab
在 Ubuntu 上安装 GitLab 的步骤如下。这里以 GitLab Community Edition(CE)为例: 前提条件 确保你的 Ubuntu 系统是 20.04 或更高版本。确保你的系统满足 GitLab 的硬件要求。 步骤 更新系统包: sudo apt update sudo apt upg…...
Stable Diffusion 3.5 介绍
Stable Diffusion 3.5 是由 Stability AI 推出的最新一代图像生成模型,是 Stable Diffusion 系列的重要升级版本。以下是关于 Stable Diffusion 3.5 的详细信息: 版本概述 Stable Diffusion 3.5 包含三个主要版本: Stable Diffusion 3.5 L…...
力扣hot100-->滑动窗口、贪心
你好呀,欢迎来到 Dong雨 的技术小栈 🌱 在这里,我们一同探索代码的奥秘,感受技术的魅力 ✨。 👉 我的小世界:Dong雨 📌 分享我的学习旅程 🛠️ 提供贴心的实用工具 💡 记…...
### 2.5.3 二叉树的基本操作
2.5.3 二叉树的基本操作 // 获取树中节点的个数 int size(Node root);// 获取叶子节点的个数 int getLeafNodeCount(Node root);// 子问题思路-求叶子结点个数// 获取第K层节点的个数 int getKLevelNodeCount(Node root,int k);// 获取二叉树的高度 int getHeight(Node root);…...
GAEA 社区:从用户到共同创造者
GAEA 模型最引人注目的方面之一是,它将用户视为共同创造者,而不仅仅是被动的消费者。在许多中心化平台中,用户就是用户。但在 GAEA 的生态系统中,每个人都在推动进步。无论您是贡献计算能力、分享有价值的数据还是帮助改进模型&am…...
记录一个连不上docker中的mysql的问题
引言 使用的debian12,不同发行版可能有些许差异,连接使用的工具是navicat lite 本来是毫无思绪的,以前在云服务器上可能是防火墙的问题,但是这个桌面环境我压根没有使用防火墙。 直到 ying192:~$ mysql -h127.0.0.1 -uroot ERROR 1045 (28…...
doris:MySQL Load
Doris 兼容 MySQL 协议,可以使用 MySQL 标准的 LOAD DATA 语法导入本地文件。MySQL Load 是一种同步导入方式,执行导入后即返回导入结果。可以通过 LOAD DATA 语句的返回结果判断导入是否成功。一般来说,可以使用 MySQL Load 导入 10GB 以下的…...
使用vitepress搭建自己的博客项目
一、介绍can-vitepress-blog 什么是CAN BLOG CAN BLOG是基于vitepress二开的个人博客系统,他能够方便使用者快速构建自己的博客文章,无需繁琐的配置和复杂的代码编写。 CAN BLOG以antdv为UI设计基础,简洁大方,界面友好…...
Yii框架中的扩展:如何使用外部库
在Yii框架中,扩展功能的一种常见且有效的方式是使用外部库。这些外部库可以帮助开发者实现特定的功能,如调用第三方API、处理图片、生成PDF文件或发送邮件等。以下是使用外部库扩展Yii框架的详细步骤: 一、安装外部库 使用Composerÿ…...
【Elasticsearch】inference ingest pipeline
Elasticsearch 的 Ingest Pipeline 功能允许你在数据索引之前对其进行预处理。通过使用 Ingest Pipeline,你可以执行各种数据转换和富化操作,包括使用机器学习模型进行推理(inference)。这在处理词嵌入、情感分析、图像识别等场景…...
Linux的基本指令(上)
1.ls指令 语法:ls [选项] [目录或文件] 功能:对于⽬录,该命令列出该⽬录下的所有⼦⽬录与⽂件。对于⽂件,将列出⽂件名以及其他信息。 常用选项: -a 列出⽬录下的所有⽂件,包括以 . 开头的隐含⽂件。 -d 将…...
【贪心算法】洛谷P1106 - 删数问题
2025 - 01 - 22 - 第 46 篇 【洛谷】贪心算法题单 - 【贪心算法】 - 【学习笔记】 作者(Author): 郑龙浩 / 仟濹(CSND账号名) 目录 文章目录 目录P1106 删数问题题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示思路代码 P1106 删数问题 题目描述 键盘输入一个高…...
【人工智能】Python中的知识图谱构建与应用
《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 随着人工智能技术的不断发展,知识图谱已成为信息检索、推荐系统、自然语言处理等领域的重要技术之一。本文将详细介绍如何使用Python构建知…...
Spring WebSocket 与 STOMP 协议结合实现私聊私信功能
目录 后端pom.xmlConfig配置类Controller类DTO 前端安装相关依赖websocketService.js接口javascripthtmlCSS 效果展示简单测试连接: 报错解决方法1、vue3 使用SockJS报错 ReferenceError: global is not defined 功能补充拓展1. 安全性和身份验证2. 异常处理3. 消息…...
【Matlab高端绘图SCI绘图模板】第05期 绘制高阶折线图
1.折线图简介 折线图是一个由点和线组成的统计图表,常用来表示数值随连续时间间隔或有序类别的变化。在折线图中,x 轴通常用作连续时间间隔或有序类别(比如阶段1,阶段2,阶段3)。y 轴用于量化的数据&#x…...
java后端之事务管理
Transactional注解:作用于业务层的方法、类、接口上,将当前方法交给spring进行事务管理,执行前开启事务,成功执行则提交事务,执行异常回滚事务 spring事务管理日志: 默认情况下,只有出现Runti…...
常见的多媒体框架(FFmpeg GStreamer DirectShow AVFoundation OpenMax)
1.FFmpeg FFmpeg是一个非常强大的开源多媒体处理框架,它提供了一系列用于处理音频、视频和多媒体流的工具和库。它也是最流行且应用最广泛的框架! 官方网址:https://ffmpeg.org/ FFmpeg 的主要特点和功能: 编解码器支持: FFmpe…...
如何移植ftp服务器到arm板子?
很多厂家提供的sdk,一般都不自带ftp服务器功能, 需要要发人员自己移植ftp服务器程序。 本文手把手教大家如何移植ftp server到arm板子。 环境 sdk:复旦微 Buildroot 2018.02.31. 解压 $ mkdir ~/vsftpd $ cp vsftpd-3.0.2.tar.gz ~/vs…...
牛批,吾爱出品
可能是因为从事IT的原因,我身边的大多数朋友也是从事相关工作的,而IT工作往往需要长时间对着电脑。这样就很容易眼睛疲劳。今天给大家推荐几款,希望有对有需要的小伙伴有所帮助,大家可以收藏以来哦。 CareUEyes CareUEyes是一款绿…...
基于 Android 的日程管理系统的设计与实现
标题:基于 Android 的日程管理系统的设计与实现 内容:1.摘要 基于 Android 的日程管理系统旨在帮助用户更高效地管理个人日程安排。该系统采用了 Android 平台的优势,结合了简洁的界面设计和强大的功能,为用户提供了便捷的日程管理体验。 在设计与实现过…...
Kubectl 与 Helm 详解
在 Kubernetes 生态中,kubectl 和 Helm 是两个核心工具,分别用于直接管理 Kubernetes 资源和简化应用的部署与管理。本文将深入探讨 kubectl 和 Helm 的功能、使用场景、部署与更新方式,并对比它们的优缺点。 1. Kubectl 详解 1.1 什么是 Kubectl? kubectl 是 Kubernetes…...
centos搭建docker registry镜像仓库
centos搭建docker registry镜像仓库 简介 Docker Registry是一个存储和分发Docker镜像的服务。它允许用户上传、下载和管理 Docker 镜像,为容器化应用的部署提供了便利。 拉取镜像 docker image pull registry证书配置 创建镜像仓库的镜像数据目录和证书目录&…...
Pyecharts之饼图与多饼图的应用
在数据可视化领域,饼图是一种常用的图表类型,特别适合展示数据的比例关系。Pyecharts 为我们提供了强大的饼图绘制功能,不仅可以轻松绘制各种饼图,还能对饼图的样式和数据标签进行深度定制,并且可以组合多个饼图以满足…...
51单片机入门_01_单片机(MCU)概述(使用STC89C52芯片;使用到的硬件及课程安排)
文章目录 1. 什么是单片机1.1 微型计算机的组成1.2 微型计算机的应用形态1.3 单板微型计算机1.4 单片机(MCU)1.4.1 单片机内部结构1.4.2 单片机应用系统的组成 1.5 80C51单片机系列1.5.1 STC公司的51单片机1.5.1 STC公司单片机的命名规则 2. 单片机的特点及应用领域2.1 单片机的…...
蓝桥杯LQ1044 求完数
题目描述 因子:因子也叫因数,例如3515,那么3和5是15的因子。 同时15115,那么1和15也是15的因子。 1,3,5,15 这四个因子是15的所有因子。 完数:如果一个数等于不含它本身的其他因子之…...
Django 日志配置实战指南
日志是 Django 项目中不可或缺的一部分,它帮助我们记录应用程序的运行状态、调试信息、错误信息等。通过合理配置日志,我们可以更好地监控和调试应用程序。本文将详细介绍如何在 Django 项目中实现日志文件分割、日志级别控制以及多环境日志配置,并结合最佳实践和代码示例,…...
[笔记] 极狐GitLab实例 : 手动备份步骤总结
官方备份文档 : 备份和恢复极狐GitLab 一. 要求 为了能够进行备份和恢复,请确保您系统已安装 Rsync。 如果您安装了极狐GitLab: 如果您使用 Omnibus 软件包,则无需额外操作。如果您使用源代码安装,您需要确定是否安装了 rsync。…...
php代码审计2 piwigo CMS in_array()函数漏洞
php代码审计2 piwigo CMS in_array()函数漏洞 一、目的 本次学习目的是了解in_array()函数和对项目piwigo中关于in_array()函数存在漏洞的一个审计并利用漏洞获得管理员帐号。 二、in_array函数学习 in_array() 函数搜索数组中是否存在指定的值。 in_array($search,$array…...
随机矩阵投影长度保持引理及其证明
原论文中的引理 2 \textbf{2} 2 1. \textbf{1. } 1. 引理 1 \textbf{1} 1(前提之一) 1.1. \textbf{1.1. } 1.1. 引理 1 \textbf{1} 1的内容 👉前提: X ∼ N ( 0 , σ ) X\sim{}N(0,\sigma) X∼N(0,σ)即 f ( x ) 1 2 π σ e – x 2 2 σ 2 f(x)\text{}…...
蓝桥杯真题 - 三国游戏 - 题解
题目链接:https://www.lanqiao.cn/problems/3518/learning/ 个人评价:难度 2 星(满星:5) 前置知识:贪心 整体思路 先假设魏蜀吴中的某一个势力最终获胜的情况下,如何求出事件发生的最大数量&a…...