Vue keepalive学习用法
在Vue中,<keep-alive>的include属性用于指定需要缓存的组件,其实现方式如下:
1. 基本用法
• 字符串形式:通过逗号分隔组件名称,匹配到的组件会被缓存。
<keep-alive include="ComponentA,ComponentB"><component :is="currentComponent"></component>
</keep-alive>
此时仅缓存名称为ComponentA和ComponentB的组件。
• 正则表达式:使用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属性。
• 优先级:若同时存在include和exclude,exclude的优先级更高。例如:
<keep-alive include="A,B" exclude="B"><component :is="currentComponent"></component>
</keep-alive>
此时仅缓存组件A,因B被排除。
4. 生命周期钩子
被缓存的组件会触发activated(激活时)和deactivated(停用时)钩子,而非created或mounted,需在对应钩子中处理状态更新。
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. 注意事项
-
状态管理:
• 缓存组件不会销毁实例,因此需谨慎处理状态(如避免重复请求数据)。
• 推荐结合 Vuex 或本地存储管理全局状态。 -
性能优化:
• 使用max属性限制缓存数量,避免内存占用过高。
• 在deactivated中清理不必要的资源(如定时器、事件监听)。 -
组件名匹配:
• 确保被缓存的组件显式声明了name属性(include/exclude依赖组件名匹配)。
总结
<keep-alive> 的生命周期机制通过 activated 和 deactivated 钩子,实现了组件状态的暂停与恢复。
相关文章:
Vue keepalive学习用法
在Vue中,<keep-alive>的include属性用于指定需要缓存的组件,其实现方式如下: 1. 基本用法 • 字符串形式:通过逗号分隔组件名称,匹配到的组件会被缓存。 <keep-alive include"ComponentA,ComponentB&…...
5-1 使用ECharts将MySQL数据库中的数据可视化
方法一:使用Python Flask框架搭建API 对于技术小白来说,使用ECharts将MySQL数据库中的数据可视化需要分步骤完成。以下是详细的实现流程: 一、技术架构 后端服务:使用Python Flask框架搭建API(简单易学ÿ…...
构建下一代AI Agent:自动化开发与行业落地全解析
1. 下一代AI Agent:概念与核心能力 核心能力描述技术支撑应用价值自主性独立规划与执行任务,无需持续人工干预决策树、强化学习、目标导向规划减少人工干预,提高任务执行效率决策能力评估多种方案并选择最优解决方案贝叶斯决策、多目标优化、…...
如何理解分布式光纤传感器?
关键词:OFDR、分布式光纤传感、光纤传感器 分布式光纤传感器是近年来备受关注的前沿技术,其核心在于将光纤本身作为传感介质和信号传输介质,通过解析光信号在光纤中的散射效应,实现对温度、应变、振动等物理量的连续、无盲区、高…...
四、小白学JAVA-石头剪刀布游戏
1、如何从控制台获取用户输入 import java.util.Scanner;public class Main {public static void main(String[] args) {// 石头剪刀布的思路// 1 2 3 石头 剪刀 布Scanner scanner new Scanner(System.in);System.out.println("请出拳:1.石头 2.剪刀 3.布【…...
【一起来学kubernetes】21、Secret使用详解
Secret 的详细介绍 Secret 是 Kubernetes 中用于存储和管理敏感信息(如密码、令牌、密钥等)的资源对象。Secret的设计目的是为了安全地存储和传输敏感信息,如密码、API密钥、证书等。这些信息通常不应该直接硬编码在配置文件或镜像中&#x…...
css重点知识汇总(一)
css重点知识汇总(一) 引入css的不同方式 link 通过src来获取相应的css资源。除了获取css之外还可以获取其他资源,例如js在页面载入是同步下载可以通过js对dom操作来改变css import css3引入的新方法只能引入css资源需要页面完全载入后才…...
PMP-项目运行环境
你好!我是 Lydia-穎穎 ♥感谢你的陪伴与支持 ~~~ 欢迎一起探索未知的知识和未来,现在lets go go go!!! 1. 影响项目的要素 项目存在在不同的环境下,环境对于项目的交付产生不同的影响。需了解环境对于项目的影响,采取相应措施应对…...
shell 脚本搭建apache
#!/bin/bash # Set Apache version to install ## author: yuan# 检查外网连接 echo "检查外网连接..." ping www.baidu.com -c 3 > /dev/null 2>&1 if [ $? -eq 0 ]; thenecho "外网通讯良好!" elseecho "网络连接失败&#x…...
Huawei 鲲鹏(ARM/Aarch64)服务器安装KVM虚拟机(非桌面视图)
提出问题 因需要进行ARM架构适配,需要在Huawei Taishan 200k(CPU: Kunpeng 920 5231K)上,创建几台虚拟机做为开发测试环境。 无奈好久没搞了,看了一下自己多年前写的文章:Huawei 鲲鹏…...
《Python实战进阶》No28: 使用 Paramiko 实现远程服务器管理
No28: 使用 Paramiko 实现远程服务器管理 摘要 在现代开发与运维中,远程服务器管理是必不可少的一环。通过 SSH 协议,我们可以安全地连接到远程服务器并执行各种操作。Python 的 Paramiko 模块是一个强大的工具,能够帮助我们实现自动化任务&…...
备赛蓝桥杯之第十六届模拟赛3期职业院校组
提示:本篇文章仅仅是作者自己目前在备赛蓝桥杯中,自己学习与刷题的学习笔记,写的不好,欢迎大家批评与建议 由于个别题目代码量与题目量偏大,请大家自己去蓝桥杯官网【连接高校和企业 - 蓝桥云课】去寻找原题࿰…...
【Kafka】深入了解Kafka
集群的成员关系 Kafka使用Zookeeper维护集群的成员信息。 每一个broker都有一个唯一的标识,这个标识可以在配置文件中指定,也可以自动生成。当broker在启动时通过创建Zookeeper的临时节点把自己的ID注册到Zookeeper中。broker、控制器和其他一些动态系…...
C++特性——RAII、智能指针
RAII 就像new一个需要delete,fopen之后需要fclose,但这样会有隐形问题(忘记释放)。RAII即用对象把这个过程给包起来,对象构造的时候,new或者fopen,析构的时候delete. 为什么需要智能指针 对于…...
C++异常处理时的异常类型抛出选择
在 C 中选择抛出哪种异常类型,主要取决于错误的性质以及希望传达的语义信息。以下是一些指导原则,帮助在可能发生异常的地方选择合适的异常类型进行抛出: 1. std::exception 适用场景:作为所有标准异常的基类,std::e…...
elsticsearch 通过reindex修改shards
elasticsearch reindex 索引。 背景: 索引test1 reindex到test2 修改sharding数量 程序是通过别名test1_alias访问索引 1、创建目标索引test2 索引需要手动提前创建自动创建可能会有mapping 不一致性的风险。 The destination should be configured as wanted …...
CentOS系类普通挂载磁盘挂载命令
检查磁盘是否有分区 lsblk如果 vdb 下面没有分区(比如 vdb1),你需要先创建分区。 创建分区(如果需要) fdisk /dev/vdb然后在 fdisk 交互界面: 输入 n 创建新分区 选择 p 创建主分区 默认分区号和大小 输…...
Kafka自定义分区机制
文章目录 1.如何自定义分区机制2.示例 1.如何自定义分区机制 若需要使用自定义分区机制,需要完成两件事: 1)在 producer 程序中创建一个类,实现 org.apache.kafka.clients.producer.Partitioner 接口主要分区逻辑在 Partitioner.partition中…...
【HarmonyOS NEXT】关键资产存储开发案例
在 iOS 开发中 Keychain 是一个非常安全的存储系统,用于保存敏感信息,如密码、证书、密钥等。与文件系统不同,Keychain 提供了更高的安全性,因为它对数据进行了加密,并且只有经过授权的应用程序才能访问存储的数据。那…...
强化学习(赵世钰版)-学习笔记(9.策略梯度法)
本章是课程的导数第二章,旨在讲解策略的函数化形式。 之前的方法,描述一个策略都是用表格的形式,每一行代表一个状态,每一列代表一个行为,表格中的元素对应相关状态下执行相关行为的概率。 函数化的策略表征形式是指&a…...
ModuleNotFoundError: No module named ‘flask‘ 错误
要解决 ModuleNotFoundError: No module named ‘flask’ 错误,需确保已正确安装 Flask 库。以下是详细步骤: 1. 安装 Flask 在终端或命令行中执行以下命令(注意权限问题): 使用 pip 安装 pip install flask 若…...
【c++】【STL】unordered_set 底层实现(简略版)
【c】【STL】unordered_set 底层实现(简略版) ps:这个是我自己看的不保证正确,觉得太长的后面会总结整个调用逻辑 unordered_set 内部实现 template <class _Kty, class _Hasher hash<_Kty>, class _Keyeq equal_to<_Kty>…...
【Zephyr】【一】学习笔记
Zephyr RTOS 示例代码集 1. 基础示例 1.0 基础配置 每个示例都需要一个 prj.conf 文件来配置项目。以下是各个示例所需的配置: 基础示例 prj.conf # 控制台输出 CONFIG_PRINTKy CONFIG_SERIALy CONFIG_UART_CONSOLEy# 日志系统 CONFIG_LOGy CONFIG_LOG_DEFAULT…...
网络安全设备配置与管理-实验4-防火墙AAA服务配置
实验4-p118防火墙AAA服务配置 从这个实验开始,每一个实验都是长篇大论😓 不过有好兄弟会替我出手 注意:1. gns3.exe必须以管理员身份打开,否则ping不通虚拟机。 win10虚拟机无法做本次实验,必须用学校给的虚拟机。首…...
后端框架模块化
后端框架的模块化设计旨在简化开发流程、提高可维护性,并通过分层解耦降低复杂性。以下是常见的后端模块及其在不同语言(Node.js、Java、Python)中的实现方式: 目录 1. 路由(Routing)2. 中间件(…...
【论文阅读】Contrastive Clustering Learning for Multi-Behavior Recommendation
论文地址:Contrastive Clustering Learning for Multi-Behavior Recommendation | ACM Transactions on Information Systems 摘要 近年来,多行为推荐模型取得了显著成功。然而,许多模型未充分考虑不同行为之间的共性与差异性,以…...
视频转音频, 音频转文字
Ubuntu 24 环境准备 # 系统级依赖 sudo apt update && sudo apt install -y ffmpeg python3-venv git build-essential python3-dev# Python虚拟环境 python3 -m venv ~/ai_summary source ~/ai_summary/bin/activate核心工具链 工具用途安装命令Whisper语音识别pip …...
基于协同过滤推荐算法的景点票务数据系统(python-计算机毕设)
摘 要 I ABSTRACT II 第 1 章 引言 1 研究背景及意义 1 研究背景 1研究意义 1 国内外研究现状 2 智慧旅游 3旅游大数据 3 研究内容 4本章小结 4 第 2 章 相关技术概述 5 基于内容的推荐算法 5 基于内容的推荐算法原理 5基于内容的推荐算法实现 5 协同过滤推荐算法 6 协同过…...
QT学习笔记1
** Qt Creator开发环境配置** 安装流程(Windows平台) 下载与安装 : 访问Qt官网,下载在线安装工具Qt Online Installer。登录或注册Qt账号,选择开源版本(需勾选“接受协议”)。勾选组件ÿ…...
Ubuntu 24 常用命令方法
文章目录 环境说明1、账号管理1.1、启用 root 2、包管理工具 apt & dpkg2.1、apt 简介 & 阿里源配置2.2、dpkg 简介2.3、apt 和 dpkg 两者之间的关系2.4、常用命令 3、启用 ssh 服务4、防火墙5、开启远程登录6、关闭交换分区7、build-essential(编译和开发软…...
