vue的动态组件keep-alive实现组件缓存和状态保留

在 Vue.js 中,动态组件结合 keep-alive 是实现组件缓存和状态保留的重要技术方案。以下是详细解析:


一、动态组件基础

通过 <component :is> 实现组件动态切换:

<component :is="currentComponent"></component>
  • currentComponent 可以是注册的组件名(字符串)或组件选项对象
  • 每次切换时会触发组件的 created/mounteddestroyed 生命周期

二、keep-alive 的核心作用

<keep-alive> 包裹动态组件实现状态缓存:

<keep-alive><component :is="currentComponent"></component>
</keep-alive>

特性

  1. 缓存不活跃组件实例(避免重复渲染)
  2. 保留组件状态(数据、DOM 状态等)
  3. 触发特殊生命周期钩子:
    • activated:组件被激活时调用
    • deactivated:组件失活时调用

三、高级配置属性

  1. include/exclude

    <keep-alive include="CompA,CompB" exclude="CompC"><component :is="currentComponent"></component>
    </keep-alive>
    
    • include:白名单(支持字符串、正则、数组)
    • exclude:黑名单
    • 匹配规则:组件名(name 选项)
  2. max(最大缓存实例数)

    <keep-alive :max="5"><component :is="currentComponent"></component>
    </keep-alive>
    
    • 超出数量时,最近最少使用的实例被销毁

四、典型应用场景

  1. 标签页切换:保持各标签页的滚动位置和表单数据
  2. 表单步骤流程:缓存已填写步骤的组件状态
  3. 列表页跳转详情:返回时保持列表滚动位置
  4. SPA 应用路由视图:配合 <router-view> 使用

五、注意事项

  1. 内存管理

    • 避免缓存过多大型组件
    • 及时清理不再需要的缓存(通过 v-if 控制)
  2. 数据更新

    <keep-alive><component :is="currentComponent" :key="refreshKey"></component>
    </keep-alive>
    
    • 强制刷新:通过修改 key 属性
  3. 生命周期

    • 被缓存的组件不会触发 mounted/destroyed
    • 使用 activated 替代 mounted 进行数据更新

六、完整示例

<template><div><button @click="currentComponent = 'CompA'">显示A</button><button @click="currentComponent = 'CompB'">显示B</button><keep-alive :include="['CompA']" :max="2"><component :is="currentComponent" @event="handleEvent"></component></keep-alive></div>
</template><script>
export default {data() {return {currentComponent: 'CompA'}},methods: {handleEvent() {// 处理子组件事件}}
}
</script>

通过合理使用动态组件与 keep-alive,可以在提升应用性能的同时,保持流畅的用户体验。建议根据具体场景选择缓存策略,并注意内存使用情况。

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

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

相关文章

安装Docker Desktop报错WSL needs updating

&#xff08;1&#xff09;首先观察下面是否勾选&#xff08;2&#xff09;说明已经启动了&#xff0c;但是需要更新&#xff0c;cmd运行下面代码&#xff0c;记得需要开一下代理&#xff0c;可能会有点慢上面就算好了&#xff08;3&#xff09;点击restart这样就代表成功了

♻️旧衣回收小程序|线上模式新升级

还在用老旧的传统方式做旧衣回收&#xff1f;别out了&#xff01;线下回收箱成本高、维护难、用户参与感弱&#xff1f;是时候用线上小程序打开全新局面了✌&#x1f4a8;线上小程序 vs 传统线下回收✅ 便捷性突破&#xff1a;线下&#xff1a;用户需亲自送至固定回收点&#x…

CD71.【C++ Dev】二叉树的三种非递归遍历方式

目录 1.知识回顾 2.前序遍历 分析 总结入栈的几种可能 循环的条件 代码 提交结果 3.中序遍历 分析 代码 提交结果 3.★后序遍历 分析 问题:如何确定是第一次访问到栈的元素还是第二次访问到栈中的元素? 方法1:使用填充的内存(依赖于架构) 判断计算机使用的架构…

音视频学习(五十九):H264中的SPS

在 H.264 (也称为 AVC, Advanced Video Coding) 视频编码标准中&#xff0c;SPS (Sequence Parameter Set) 是一个至关重要的 NALU (Network Abstraction Layer Unit) 类型&#xff0c;它承载着整个视频序列共有的全局性配置信息。你可以把它理解为视频文件的“基因”&#xff…

linux实时性研究

Linux 实时性研究旨在提升 Linux 系统对外部事件的响应速度和确定性,使其能够满足实时应用的需求。以下是关于 Linux 实时性研究的一些关键内容: Linux 实时性不足的原因 中断优先级问题:在标准 Linux 内核中,中断具有最高优先级,包括软中断,这使得实时任务的优先级得不到…

Java-面试八股文-Mysql篇

MySQL篇 1、Select 语句完整的执行顺序 难度系数&#xff1a;⭐&#x1f4cc; SQL SELECT 语句书写顺序&#xff08;开发者写的顺序&#xff09; SELECT ... FROM ... JOIN ... WHERE ... GROUP BY ... HAVING ... ORDER BY ... LIMIT ...&#x1f4cc; 实际执行顺序&#…

多代理系统架构:Supervisor 与 Swarm 架构详解

多代理&#xff08;Multi-Agent&#xff09;系统正成为构建复杂 AI 应用的重要范式。本文将深入剖析两种热门的多代理架构模式——Supervisor&#xff08;主管模式&#xff09;与 Swarm&#xff08;群智模式&#xff09;&#xff0c;揭示它们的执行流程、适用场景及实现细节&am…

【深度学习】思维链(Chain of Thought, CoT):提升大模型推理能力的关键技术

思维链&#xff08;Chain of Thought, CoT&#xff09;&#xff1a;提升大模型推理能力的关键技术 文章目录思维链&#xff08;Chain of Thought, CoT&#xff09;&#xff1a;提升大模型推理能力的关键技术1 什么是思维链&#xff08;Chain of Thought, CoT&#xff09;&#…

GitHub 宕机自救指南:打造韧性开发体系

一、引言1.1 GitHub 宕机事件回顾与影响剖析在软件开发的广袤版图中&#xff0c;GitHub 宛如一座熠熠生辉的灯塔&#xff0c;为全球超 1 亿开发者照亮前行之路&#xff0c;其重要性不言而喻。它集代码托管、版本控制、协作开发以及项目管理等核心功能于一身&#xff0c;是无数开…

移动端网页调试实战,iOS WebKit Debug Proxy 的应用与替代方案

在移动端开发中&#xff0c;iOS WebView 的调试一直是个难题。不同于 Android 可以依赖 Chrome DevTools 和 ADB&#xff0c;iOS 的 WKWebView 只能通过 Safari 开发者工具调试&#xff0c;而这需要 Mac 环境和设备直连。为了弥补限制&#xff0c;社区出现了一个常用工具 —— …

焕新升级,Sermant 2.0.0 release版本重磅发布!

Sermant社区在6月底正式发布了2.0.0 release版本&#xff0c;这次更新中&#xff0c;Sermant进行了项目所属组织调整并新增了基于xDS协议的服务发现能力、预过滤启动加速机制、Sermant Backend的配置管理能力。所属组织调整使得Sermant淡化厂商属性&#xff0c;以全新的姿态更好…

sqli-labs通关笔记-第28a关GET字符注入(多重关键字过滤绕过 脚本法)

目录 一、sqlmap之tamper脚本 二、源码分析 1、代码审计 2、SQL安全性分析 三、渗透实战 1、进入靶场 2、tamper脚本 3、sqlmap渗透 SQLI-LABS 是一个专门为学习和练习 SQL 注入技术而设计的开源靶场环境&#xff0c;本小节对第28a关Less 28a基于GET字符型的SQL注入关卡…

联想打印机2268w安装

联想打印机2268w是支持无线打印的。在某度搜索&#xff0c;掀起盖子长按开机键&#xff0c;成功初始化。之后按说明应该能用手机搜索到打印机的热点&#xff0c;反复搜索都没有出现。最后没办法&#xff0c;之后好用我自己的方法安装。找了个笔记本&#xff0c;开机连接到wifi,…

【LeetCode】动态规划——72.编辑距离、10.正则表达式匹配

LeetCode题目链接 https://leetcode.cn/problems/edit-distance/description/ https://leetcode.cn/problems/regular-expression-matching/description/ 题解 72.编辑距离 本题要定义为长度为i、长度为j的字符串的最少编辑次数&#xff0c;每次判断字符的下标为i-1、j-1。dp[i…

[亲测可用]Android studio配置国内镜像源 Kotlin DSL (build.gradle.kts)

一、更改gradle下载镜像Android studio项目需要下载和更新 Gradle 及其依赖。由于网络环境&#xff0c;直接从 Gradle 官网下载可能会遇到速度慢或超时的问题。这里需要更换为使用国内的镜像站点来加速下载。官网地址&#xff08;较慢&#xff09;&#xff1a;https://services…

《跳出“技术堆砌”陷阱,构建可演进的软件系统》

很多团队陷入了“技术焦虑式开发”—盲目追逐热门框架&#xff0c;将“使用微服务”“引入云原生”“集成AI组件”当作架构先进的标签&#xff0c;却忽视了业务与技术的底层匹配逻辑。某互联网团队为了“彰显技术实力”&#xff0c;在内部协同工具中强行接入机器学习推荐模块&a…

赋能你的应用:英超实时数据接入终极指南(API vs. WebSocket)

在当今数据驱动的时代&#xff0c;为您的应用程序注入实时、准确的英超赛事数据&#xff0c;是提升用户体验、打造差异化竞争力的关键。无论是开发一款球迷必备的比分追踪App&#xff0c;一个深度专业的赛事分析平台&#xff0c;还是一个充满互动性的梦幻足球游戏&#xff0c;首…

计算机网络:(poll、epoll)

一、select的不足1. 最大监听数受限&#xff1a;FD_SETSIZE 默认 1024&#xff08;Linux&#xff09;2. 每次调用需重置 fd_set&#xff1a;内核会修改集合&#xff0c;必须每次重新 FD_SET3. 用户态与内核态拷贝开销大4. 返回后仍需遍历所有 fd 才能知道哪个就绪5. 效率随 fd …

网络编程之设置端口复用

首先来说一下为什么要设置端口复用&#xff0c;有些时候在调试服务器代码时势必会经常启动或结束服务器进程&#xff0c;这样就会出现当再次启动服务器时有可能会出现端口绑定失败的情况&#xff0c;造成这个情况的原因是由于你上次关闭服务器时有连接尚未断开等等其他原因&…

stargo缩扩容starrocks集群,实现节点服务器替换

1.背景在企业中可能需要&#xff0c;将starrocks的某一台服务器下架&#xff0c;换上另一台服务器&#xff0c;如何实现这个操作&#xff0c;本篇将进行介绍&#xff1b;节点hadoop101hadoop102hadoop103hadoop104集群原集群节点新节点fe✔✔❌&#xff08;下线&#xff09;✔&…