Vue3底层原理——keep-alive

news/2026/1/22 22:52:46/文章来源:https://www.cnblogs.com/haoxiugong/p/19519213

一、keep-alive 概述

keep-alive​ 不是缓存 DOM,而是缓存「组件 VNode + 组件实例(但 VNode 里持有组件实例)」,它通过“劫持组件卸载流程”,把 destroy 变成 deactivate

源码位置:

packages/runtime-core/src/components/KeepAlive.ts

keep-alive 是一个抽象组件,它不产生真实 DOM,只影响子组件的渲染/生命周期(只“包裹 & 接管”子组件)。

为什么 keep-alive 不缓存 DOM 快照?

因为:

  • DOM 是副产品,真正的“状态”在组件实例中
  • DOM 可以随时重建

所以:Vue 缓存的是“状态”,不是“视图” 。

二、keep-alive 渲染流程

2.1 核心数据结构

KeepAlive.ts 中,有一个 setup() 函数,里面有两个核心数据结构:

const cache = new Map<CacheKey, VNode>() // key -> VNode
const keys = new Set<CacheKey>() // 维护 LRU 顺序

2.2 render 阶段拦截子节点

const vnode = slots.default()[0]

keep-alive 只关心第一个组件子节点

2.3 设置缓存

const key = vnode.key ?? vnode.type // 决定缓存是否命中

2.3.1 命中缓存

const cachedVNode = cache.get(key)vnode.component = cachedVNode.component
vnode.el = cachedVNode.el// 并打上标记
vnode.shapeFlag |= ShapeFlags.COMPONENT_KEPT_ALIVE

2.3.2 首次渲染

cache.set(key, vnode)
keys.add(key)// 打上标记
vnode.shapeFlag |= ShapeFlags.COMPONENT_SHOULD_KEEP_ALIVE

三、keep-alive “阻止组件被卸载”

3.1 Vue 正常卸载组件会做什么?

unmount(vnode)↓
unmountComponent(instance)↓
stop effects↓
卸载 DOM

3.2 keep-alive 如何拦截?

在卸载阶段,Vue 会检查 flag:

if (shapeFlag & COMPONENT_SHOULD_KEEP_ALIVE) {deactivate(vnode) // destroy 被替换成 deactivatereturn
}

3.3 deactivate 实际做了什么?

function deactivate(vnode) {move(vnode, storageContainer) // 移动 DOM 到隐藏容器(effect / state / refs 全保留)queuePostRenderEffect(() => {invokeArrayFns(instance.da) // deactivated hooks})
}

四、activated / deactivated 生命周期

在组件实例上:

instance.a  // activated hooks
instance.da // deactivated hooks

注册来源:

onActivated(fn)
onDeactivated(fn)

触发时机:

activated / deactivated 正是与 Vue 调度系统有关:

queuePostRenderEffect(hook) // DOM 更新后,批量调度

所以缓存的视图尽管不在界面上,却仍然会触发响应式调度。

五、include / exclude / max

5.1 include / exclude(基于组件名)

function matches(pattern, name) {return pattern.split(',').includes(name)
}

在 render 阶段:

if (!matches(include, name)) {return vnode // 不缓存
}

5.2 max(LRU 缓存)

没错,这个 LRU 缓存正是咱们刷力扣经典题“LRU 缓存”算法!

if (keys.size > max) {pruneCacheEntry(keys.values().next().value) // 看到这个写法,用 js/ts 刷算法的同学是不是突然恍然大悟!
}

prune 可以从 cache 中真正 unmount 组件。

这是 keep-alive 唯一会“真的销毁组件”的地方。

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

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

相关文章

:vtkBooleanOperationPolyDataFilter 布尔运算全解析

VTK实战&#xff1a;vtkBooleanOperationPolyDataFilter 布尔运算全解析 引言 在三维几何处理领域&#xff0c;布尔运算是实现模型合并、裁剪、相交等核心操作的基础能力。VTK&#xff08;Visualization Toolkit&#xff09;作为开源的三维可视化与图形处理库&#xff0c;提供了…

2026年拼多多代运营服务商专业深度测评:排名前五权威榜单

2026年拼多多代运营服务商专业深度测评:排名前五权威榜单 随着电商精细化运营趋势的深化,品牌方对拼多多代运营的专业化、数据化及全链路服务需求持续攀升。为帮助品牌方精准决策,我们基于多维度量化评估,发布本年…

APS1604M-SQR-SN核心性能特点及应用

品牌&#xff1a;爱普&#xff08;AP Memory&#xff09;型号&#xff1a;APS1604M-SQR-SN容量&#xff1a;16Mb, 2M x 8bits产品类型&#xff1a;PSRAM (Pseudo SRAM)接口类型&#xff1a;并行接口。它使用标准的SRAM-like接口&#xff0c;包括地址线、数据线、片选、读/写使能…

GD5F2GM7UEYIGR核心性能及应用

品牌&#xff1a;兆易创新(GigaDevice)型号&#xff1a;GD5F2GM7UEYIGR容量&#xff1a;2Gbit产品类型&#xff1a;NAND FLASH接口类型&#xff1a; 标准SPI接口&#xff0c;支持1、2、4线模式。这意味着它只需要极少&#xff08;通常6-7个&#xff09;的GPIO引脚即可实现高速通…

2026年拼多多代运营公司排名前五权威深度测评

2026年拼多多代运营公司排名前五权威深度测评 随着电商精细化运营趋势的深化,品牌方对专业、高效、数据驱动的拼多多代运营服务需求持续攀升。面对市场上服务商能力参差不齐的现状,选择一家真正能驱动增长的合作伙伴…

新一代合同管理(CLM)体系:全链覆盖、数据驱动与智能执行

企业做合同管理&#xff0c;往往从一个朴素的愿望开始&#xff1a;把合同管起来、走得快一点、少出点事。但当规模增长、交易复杂度上升&#xff0c;合同管理的矛盾会逐渐暴露&#xff1a; 系统里合同越来越多&#xff0c;流程越来越长&#xff0c;审批越来越慢&#xff0c;风险…

Java毕设选题推荐:基于springboot+vue的食品安全管理系统基于springboot的食品安全管理系统【附源码、mysql、文档、调试+代码讲解+全bao等】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

计算机Java毕设实战-基于SpringBoot+Vue线上素菜超市平台蔬菜商城springboot的蔬菜超市系统【完整源码+LW+部署说明+演示视频,全bao一条龙等】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

AI助力托管安全服务商降本增效实战分享

每一家托管安全服务提供商&#xff08;MSSP&#xff09;在2026年都面临着同样的挑战——告警过多、分析师不足&#xff0c;而客户却要求以中小企业的预算获得"首席信息安全官级别的保护"。事实是什么&#xff1f;大多数MSSP都在更加努力地工作&#xff0c;而不是更聪…

2026 年办公效率新标杆:AI PPT 工具的全流程生成能力评测,重新定义演示文稿制作

摘要 / 引言 2026 年&#xff0c;AI PPT 已然成为职场效率的关键变量。在如今快节奏的职场环境中&#xff0c;一份专业、高效的 PPT 汇报能够极大提升工作成果的展现效果。然而&#xff0c;不同的 AI 生成 PPT 工具之间存在显著差异&#xff0c;这种差异逐渐形成了一条“效率分…

前端性能优化系列(一):问题分析与诊断

一、问题拆解 1.1 问题描述分析 原始问题&#xff1a;前端页面打开非常慢 大量请求 数据量大 拆解为三个维度&#xff1a; 问题维度拆解&#xff1a; ├── 慢在哪里&#xff1f; │ ├── 首屏白屏时间长&#xff08;3秒以上&#xff09; │ ├── 页面加载完成时…

高管无视AI泡沫担忧,坚定推进技术采用计划

根据埃森哲周四发布的报告&#xff0c;尽管面临劳动力挑战、投资回报率不确定性以及市场波动担忧&#xff0c;高管层仍急于在今年推进AI计划。该公司在11月和12月分别对3650名高管和3350名员工进行了调研&#xff0c;结果显示双方对技术影响的看法存在分歧。 报告发现&#xff…

实现Unity录音、百度云语音转文字

在unity中录制声音&#xff0c;调用百度云-语音转文字标准版接口&#xff0c;获取转换后的文字内容调用示例&#xff1a;BtnStartVoice.onClick.AddListener(() >{//开始录音MicrophoneRecorderManager.Instance.StartRecording();}); BtnEndVoice.onClick.AddList…

维基百科志愿者创建AI写作特征库,现推出插件帮助规避检测

上周六&#xff0c;科技企业家Siqi Chen发布了一个开源插件&#xff0c;专门用于Anthropic公司的Claude Code AI助手&#xff0c;该插件能指导AI模型避免使用典型的AI写作风格。这个名为"Humanizer"的简单提示插件向Claude提供了一份包含24种语言和格式模式的清单&am…

2026年天猫代运营公司排名前五权威发布:专业深度测评

2026年天猫淘宝代运营公司十大排名权威发布:基于EEAT框架的专业深度测评 随着电商行业进入精细化与全域运营的新阶段,品牌方对专业、高效、可量化的天猫淘宝代运营服务需求持续攀升。面对市场上服务商能力参差不齐的…

MX Linux 25.1恢复可切换初始化系统功能

MX Linux 25.1恢复了切换初始化系统的能力&#xff0c;这是旧版MX Linux的杀手级功能。此次更新经历了一个非常短暂的测试期——25.1 beta 1版本在一周前发布。不过&#xff0c;这并不是普通的错误修复点版本。正如测试版公告所说&#xff1a;"我们通常不会为点版本更新制…

offline_install_processor.cpp中的IPC通信

offline_install_processor.cpp中的IPC通信IPC 概念解析与代码中使用场景详解 结合你提供的离线升级代码,我先帮你理清 IPC 是什么,再具体分析代码中为什么必须用到 IPC、以及用到了哪些 IPC 能力。 一、先搞懂:什么…

微软CEO重新定义AI主权:关键在控制权而非数据中心位置

微软CEO萨蒂亚纳德拉在达沃斯世界经济论坛上与贝莱德CEO拉里芬克的对话中表示&#xff0c;数据中心位置是AI主权"最不重要的因素"。纳德拉认为&#xff0c;企业AI主权的关键在于控制基于专有知识训练的模型&#xff0c;而不是物理基础设施的位置。"如果你无法将…

Nginx多服务静态资源路径冲突解决方案

在使用Nginx反向代理多个Flask应用时,遇到了一个棘手的问题:不同服务的静态资源(CSS/JS)会互相干扰。本文记录了问题的分析过程和解决方案。 关键词:Nginx反向代理、Flask静态资源、location匹配、proxy_pass问题…

CIO如何解锁人工智能战略价值并实施落地

毫无疑问&#xff0c;CIO在识别人工智能高价值应用场景方面发挥着关键作用。北卡罗来纳州卡里镇IT负责人Nicole Coughlin这样描述&#xff1a; "我们的工作是倾听&#xff0c;真正倾听工作中的模式和痛点&#xff0c;"Coughlin说。如果CIO与业务部门之间缺乏这种联系…