Vue keepalive学习用法

在Vue中,<keep-alive>include属性用于指定需要缓存的组件,其实现方式如下:

1. 基本用法

字符串形式:通过逗号分隔组件名称,匹配到的组件会被缓存。

<keep-alive include="ComponentA,ComponentB"><component :is="currentComponent"></component>
</keep-alive>

此时仅缓存名称为ComponentAComponentB的组件。

正则表达式:使用v-bind动态绑定正则表达式,匹配组件名称。

<keep-alive :include="/Component[A-Z]/"><component :is="currentComponent"></component>
</keep-alive>

此时匹配名称以Component开头且后续为大写字母的组件。

数组形式:通过数组动态指定缓存组件。

<keep-alive :include="['ComponentA', 'ComponentB']"><component :is="currentComponent"></component>
</keep-alive>

支持动态计算属性返回数组,例如结合路由元信息。


2. 动态控制缓存

结合路由元信息:在路由配置中通过meta字段标记需缓存的组件,再通过计算属性动态生成include值。

// 路由配置
const routes = [{ path: '/pageA', component: PageA, meta: { keepAlive: true } },{ path: '/pageB', component: PageB, meta: { keepAlive: false } }
];// 动态include
<keep-alive :include="cachedComponents"><router-view></router-view>
</keep-alive>computed: {cachedComponents() {return this.$route.matched.filter(route => route.meta.keepAlive).map(route => route.name);}
}

此方式通过路由元信息灵活控制缓存。


3. 注意事项

组件需设置name属性include通过组件名称匹配,因此被缓存组件必须显式定义name属性。
优先级:若同时存在includeexcludeexclude的优先级更高。例如:

<keep-alive include="A,B" exclude="B"><component :is="currentComponent"></component>
</keep-alive>

此时仅缓存组件A,因B被排除。


4. 生命周期钩子

被缓存的组件会触发activated(激活时)和deactivated(停用时)钩子,而非createdmounted,需在对应钩子中处理状态更新。


1. <keep-alive> 的生命周期流程

当组件被包裹在 <keep-alive> 内时,其生命周期会分为以下阶段:

阶段触发条件回调钩子行为说明
初次进入组件首次被渲染created, mounted正常初始化,执行逻辑
切换至其他组件组件被切换到非活动状态deactivated停用回调,保存状态或清理资源
再次被激活组件重新进入活动状态activated激活回调,恢复状态或刷新数据
组件销毁缓存达到 max 限制或手动销毁destroyed销毁组件实例,释放内存

2. 关键生命周期钩子详解

(1) activated 钩子

触发时机:组件从缓存中被重新激活时(例如用户返回到该页面)。
典型用途
• 加载最新数据(例如从服务端获取)。
• 恢复动态修改的 DOM 状态(如滚动位置、定时器)。
• 更新组件内部状态(如重置表单或重新计算数据)。
示例

export default {activated() {console.log('组件被激活');this.fetchData(); // 刷新数据this.initTimer(); // 重启定时器},
};
(2) deactivated 钩子

触发时机:组件被切换到缓存中(例如用户跳转到其他页面)。
典型用途
• 取消定时器或异步操作,避免内存泄漏。
• 保存当前状态到本地存储或 Vuex。
• 暂停动画或视频播放。
示例

export default {deactivated() {console.log('组件被停用');clearInterval(this.timer); // 清除定时器this.saveScrollPosition(); // 保存滚动位置},
};
(3) destroyed 钩子

触发时机:当组件被彻底销毁时(例如缓存满后被移除,或调用 $destroy())。
典型用途
• 释放强引用资源(如 WebSocket 连接)。
• 清理全局事件监听器。
注意:仅在组件被销毁时触发,缓存中的组件不会触发此钩子


3. 生命周期对比(普通组件 vs <keep-alive> 组件)

钩子普通组件<keep-alive> 组件
created✅(仅第一次初始化时触发)
mounted✅(仅第一次初始化时触发)
updated
deactivated✅(停用时触发)
activated✅(激活时触发)
destroyed✅(组件销毁时触发)✅(缓存超限或手动销毁时触发)

4. 实际应用场景

场景 1:页面切换时保留滚动位置
export default {data() {return { scrollY: 0 };},activated() {// 恢复滚动位置window.scrollTo(0, this.scrollY);},deactivated() {// 保存滚动位置this.scrollY = window.scrollY;},
};
场景 2:列表页滚动加载数据
export default {data() {return { page: 1, loading: false };},activated() {if (!this.loading) {this.fetchMoreData(); // 刷新数据}},
};

5. 注意事项

  1. 状态管理
    • 缓存组件不会销毁实例,因此需谨慎处理状态(如避免重复请求数据)。
    • 推荐结合 Vuex 或本地存储管理全局状态。

  2. 性能优化
    • 使用 max 属性限制缓存数量,避免内存占用过高。
    • 在 deactivated 中清理不必要的资源(如定时器、事件监听)。

  3. 组件名匹配
    • 确保被缓存的组件显式声明了 name 属性(include/exclude 依赖组件名匹配)。


总结

<keep-alive> 的生命周期机制通过 activateddeactivated 钩子,实现了组件状态的暂停与恢复

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

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

相关文章

搭建个人博客教程(Hexo)

如何快速搭建一套本地的博客系统呢&#xff1f;这里有一套gitNode.jsHexo的部署方案来进行解决。 安装git Git 是一款免费开源的分布式版本控制系统&#xff0c;由 Linus Torvalds 于 2005 年为 Linux 内核开发设计。它通过本地仓库和远程仓库实现代码管理&#xff0c;支持分支…

手撕算法之`vector` 扩容、`string` 分割、链表翻转

手写常见操作:vector 扩容、string 分割、链表翻转 (一)vector扩容 在 C++ 中,vector 的扩容机制是动态数组实现的核心特性,直接关系到性能和内存使用效率。以下是深入剖析: 1. 扩容触发条件 vector<int> v; v.push_back(1); // 当 size() == capacity() 时触发…

鸿蒙NEXT开发问题大全(不断更新中.....)

目录 问题1&#xff1a;鸿蒙NEXT获取华为手机的udid ​问题2&#xff1a;[Fail]ExecuteCommand need connect-key? 问题3&#xff1a;测试时如何安装app包 问题1&#xff1a;鸿蒙NEXT开发获取华为手机的udid hdc -t "设备的序列号" shell bm get --udid 问题2&…

LiteratureReading:[2016] Enriching Word Vectors with Subword Information

文章目录 一、文献简明&#xff08;zero&#xff09;二、快速预览&#xff08;first&#xff09;1、标题分析2、作者介绍3、引用数4、摘要分析&#xff08;1&#xff09;翻译&#xff08;2&#xff09;分析 5、总结分析&#xff08;1&#xff09;翻译&#xff08;2&#xff09;…

ZMC600E,多核异构如何成就机器人精准控制?

ZMC600E主站控制器凭借其多核异构处理器的强大性能&#xff0c;实现了高算力与高实时性的完美平衡&#xff0c;让机器人动作流畅、精准无误。接下来&#xff0c;让我们深入了解其内核结构的奥秘。 在ZMC600E主站控制器控制机器人的时候&#xff0c;可以精准的控制机器人执行各种…

一文掌握 PostgreSQL 的各种指令(PostgreSQL指令备忘)

引言 PostgreSQL 作为一款功能强大、开源的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;以其高扩展性、SQL 标准兼容性以及丰富的功能特性&#xff0c;成为企业级应用的首选数据库之一。无论是开发、运维还是数据分析&#xff0c;掌握 PostgreSQL 的核心指…

fastadmin后台管理员日志指定方法不记录

做的订单提醒,只要在线会把日志自动存储进去,这个又是每30s执行一次,数据库没多久就爆掉了,最终找到一个处理方法,可能不是最好的,仅供大家参考 具体位置: application/admin/model/AdminLog.php里面的$ignoreRegex方法 protected static $ignoreRegex [/^(.*)\/(selectpage…

Redis Sentinel(哨兵模式)高可用性解决方案

一、概述 Redis Sentinel&#xff08;哨兵模式&#xff09;是Redis的高可用性&#xff08;High Availability, HA&#xff09;解决方案&#xff0c;它通过哨兵系统和Redis实例的协同工作&#xff0c;确保了Redis服务的高可用性和数据的持久性。哨兵系统由一个或多个哨兵进程组…

密码学(Public-Key Cryptography and Discrete Logarithms)

Public-Key Cryptography and Discrete Logarithms Discrete Logarithm 核心概念&#xff1a;离散对数是密码学中一个重要的数学问题&#xff0c;特别是在有限域和循环群中。它基于指数运算在某些群中是单向函数这一特性。也就是说&#xff0c;给定一个群 G G G和一个生成元 …

tcp 通信在wifi 下会出现内容错误吗?

TCP通信在WiFi下可能会出现内容错误。TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09;是一种面向连接的、可靠的、基于字节流的传输层通信协议。在WiFi环境下&#xff0c;由于信号干扰、信号衰减、多径传播等因素&#xff0c;可能会造成数据…

JVM OOM问题如何排查和解决

在 Java 开发中&#xff0c;JVM OOM&#xff08;OutOfMemoryError&#xff09;问题通常是指程序运行时&#xff0c;JVM 无法为对象分配足够的内存空间&#xff0c;导致发生内存溢出的错误。这个问题往往和内存的配置、内存泄漏、或者资源过度使用等因素有关。 1. OOM 错误类型…

深入解析音频编解码器(Audio CODEC):硬件、接口与驱动开发

音频编解码器&#xff08;Audio CODEC&#xff09;是音频处理系统中的核心组件&#xff0c;负责 模拟信号与数字信号的相互转换&#xff0c;广泛应用于 智能音箱、嵌入式系统、消费电子产品 等设备。本篇文章将从 硬件结构、接口解析、驱动开发 和 软件配置 等方面&#xff0c;…

【QGIS_Python】在QGIS的Python控制台生成SHP格式点数据并显示标注

参考文章&#xff1a; 「GIS教程」使用DeepSeek辅助QGIS快速制图 | 麻辣GIS 示例代码说明&#xff1a;使用参考文章中的省会城市坐标点&#xff0c;左侧增加一列城市序号code, 图层标注显示 code 城市名称&#xff0c;同时在指定路径下生成对应SHP格式点数据。 import os fr…

deepSpeed多机多卡训练服务器之间,和服务器内两个GPU是怎么通信

DeepSpeed 在多机多卡训练时,主要依赖 NCCL 和 PyTorch Distributed 进行通信。具体来说,分为服务器之间和服务器内两种情况: 1. 服务器之间的通信(跨节点通信) DeepSpeed 采用 NCCL(NVIDIA Collective Communications Library)作为主要的通信后端,结合 PyTorch Distr…

k8s-coredns-CrashLoopBackOff 工作不正常

本文作者&#xff1a; slience_me 问题描述 # 问题描述 # rootk8s-node1:/home/slienceme# kubectl get pods --all-namespaces # NAMESPACE NAME READY STATUS RESTARTS AGE # kube-flannel kube-flannel-ds-66bcs …

新能源电站系统建设提速!麒麟信安操作系统驱动光伏风电双领域安全升级

在全球能源结构加速向清洁能源转型的背景下&#xff0c;新能源电站建设正如火如荼地展开&#xff0c;麒麟信安操作系统为光伏与风电领域提供了稳定可靠的底座支持&#xff0c;目前已在中电乾阳光伏、辽宁铁岭风电场、清河光伏、鑫田茨沟风电场、连山风电场等新能源场站落地应用…

Oracle 19c 子分区表索引测试

一、建表语句放在最后&#xff0c;方便查看 二、创建各类索引 --创建本地的主键约束&#xff0c;但必须加上分区键、子分区键MT_O_CODE,M_YMD alter table MS_DMG.A_RED drop constraint MGR_PK_AREAD ; alter table MS_DMG.A_RED add constraint MGR_PK_AREAD primary key …

Linux Vim 寄存器 | 从基础分类到高级应用

注&#xff1a;本文为 “vim 寄存器” 相关文章合辑。 英文引文&#xff0c;机翻未校。 中文引文&#xff0c;略作重排。 未整理去重&#xff0c;如有内容异常&#xff0c;请看原文。 Registers 寄存器 Learning Vim registers is like learning algebra for the first ti…

【Java/数据结构】队列(Quque)

本博客将介绍队列的相关知识&#xff0c;包括基于数组的普通队列&#xff0c;基于链表的普通队列&#xff0c;基于数组的双端队列&#xff0c;基于链表的双端队列&#xff0c;但不包括优先级队列&#xff08;PriorityQueue&#xff09;&#xff0c;此数据结构将单独发一篇博客&…

[数据结构]排序之 归并排序(有详细的递归图解)

一、非递归 基本思想&#xff1a; 归并排序&#xff08; MERGE-SORT &#xff09;是建立在归并操作上的一种有效的排序算法 , 该算法是采用分治法&#xff08; Divide andConquer&#xff09;的一个非常典型的应用。将已有序的子序列合并&#xff0c;得到完全有序的序列&#x…