什么是vue的keep-alive?它是如何实现的?具体缓存了什么内容?

在这里插入图片描述

文章目录

      • 一、`keep-alive` 的核心作用
      • 二、实现原理
        • 1. 缓存管理策略
        • 2. 核心源码解析(Vue 2.x 简化版)
        • 3. 缓存生命周期
      • 三、缓存的具体内容
        • 1. 缓存对象结构
        • 2. 具体缓存内容
      • 四、使用示例
        • 1. 基础用法
        • 2. 配置缓存策略
      • 五、注意事项
      • 六、实现流程图解

Vue 的 keep-alive 是一个内置组件,用于缓存不活动的组件实例,避免重复渲染,从而优化应用性能。它常用于需要保留组件状态或避免重复加载的场景(如标签页切换、路由视图缓存)。以下是其核心实现原理和缓存内容的详细解析:


一、keep-alive 的核心作用

  1. 缓存组件实例:当组件被切换时,不会销毁,而是保留在内存中
  2. 保留组件状态:保持当前组件的所有状态(data、DOM 结构等)
  3. 避免重复渲染:再次激活时直接复用缓存,跳过创建/挂载过程

二、实现原理

1. 缓存管理策略
  • LRU 算法(最近最少使用):当缓存数量超过 max 限制时,自动移除最久未使用的实例
  • 缓存存储结构:使用 JavaScript 对象存储缓存实例,数组记录访问顺序
2. 核心源码解析(Vue 2.x 简化版)
export default {name: 'keep-alive',abstract: true, // 标记为抽象组件,不渲染 DOM 元素props: {include: [String, RegExp, Array], // 白名单exclude: [String, RegExp, Array], // 黑名单max: [String, Number]            // 最大缓存数},created() {this.cache = Object.create(null) // 缓存池 { key: VNode }this.keys = []                   // 缓存键的访问顺序},destroyed() {// 清理所有缓存for (const key in this.cache) {pruneCacheEntry(this.cache, key, this.keys)}},render() {const slot = this.$slots.defaultconst vnode = getFirstComponentChild(slot) // 获取包裹的第一个组件const componentOptions = vnode?.componentOptionsif (componentOptions) {const name = getComponentName(componentOptions)// 检查是否匹配 include/excludeif ((this.include && (!name || !matches(this.include, name))) ||(this.exclude && name && matches(this.exclude, name))) {return vnode}const key = vnode.key == null? componentOptions.Ctor.cid + (componentOptions.tag ? `::${componentOptions.tag}` : ''): vnode.key// 命中缓存if (this.cache[key]) {vnode.componentInstance = this.cache[key].componentInstance// 更新访问顺序remove(this.keys, key)this.keys.push(key)} else {this.cache[key] = vnodethis.keys.push(key)// 清理超出 max 的旧缓存if (this.max && this.keys.length > parseInt(this.max)) {pruneCacheEntry(this.cache, this.keys[0], this.keys)}}vnode.data.keepAlive = true // 标记为 keep-alive 组件}return vnode}
}
3. 缓存生命周期
生命周期触发时机典型用途
activated组件被激活(进入缓存视图)刷新数据、启动动画
deactivated组件被停用(离开缓存视图)停止定时器、保存临时状态

三、缓存的具体内容

1. 缓存对象结构
{cache: {'component1::key1': {componentInstance: ComponentInstance, // 组件实例data: {keepAlive: true,        // 特殊标记// ...其他 VNode 信息},// ...完整 VNode 信息},'component2::key2': { ... }},keys: ['component1::key1', 'component2::key2']
}
2. 具体缓存内容
内容类型说明
组件实例完整的 Vue 组件实例(包含 data、methods、生命周期等)
DOM 结构组件对应的真实 DOM 节点
状态数据所有响应式数据、计算属性、观察者等
事件监听器通过 v-on$on 绑定的事件
插槽内容<slot> 中的子组件和 DOM 结构

四、使用示例

1. 基础用法
<template><keep-alive><component :is="currentComponent"></component></keep-alive>
</template>
2. 配置缓存策略
<template><keep-alive :include="['Home', 'User']" :exclude="['Login']" :max="5"><router-view></router-view></keep-alive>
</template>

五、注意事项

  1. 不要缓存过多组件:合理设置 max 防止内存泄漏
  2. 动态组件必须定义 name:用于 include/exclude 匹配
  3. 避免缓存高频变化组件:如实时数据展示组件
  4. 路由缓存需结合 key:确保相同路由不同参数的组件独立缓存
    <keep-alive><router-view :key="$route.fullPath"></router-view>
    </keep-alive>
    

六、实现流程图解

组件首次渲染
是否匹配 include/exclude?
创建实例并缓存
正常渲染
标记 keepAlive
组件再次激活
缓存存在?
直接复用实例
缓存淘汰
缓存数量超过max?
移除最久未使用的缓存

通过这种机制,keep-alive 在保证性能优化的同时,智能管理内存使用,是 Vue 性能优化体系中的重要组成部分。
在这里插入图片描述

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

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

相关文章

pytest基础知识

pytest知识了解 pytest的基础知识了解&#xff1a;Python测试框架之pytest详解_lovedingd的博客-CSDN博客_pytest框架 (包含设置断点&#xff0c;pdb&#xff0c;获取最慢的10个用例的执行耗时) pytest-pytest.main()运行测试用例&#xff0c;pytest参数&#xff1a; pytest-…

Liunx(CentOS-6-x86_64)使用Nginx部署Vue项目

一&#xff1a;编译vue项目和上传到linux系统 通过本地编译器编译后的文件 上传服务器后的 二&#xff1a;安装 node&#xff08;版本 v16.20.2&#xff09;和npm&#xff08; 8.19.4或 9.6.5&#xff09; 备注一&#xff1a;安装nodejs就是安装node和npm&#xff0c; su…

分布式锁—Redisson的同步器组件

1.Redisson的分布式锁简单总结 Redisson分布式锁包括&#xff1a;可重入锁、公平锁、联锁、红锁、读写锁。 (1)可重入锁RedissonLock 非公平锁&#xff0c;最基础的分布式锁&#xff0c;最常用的锁。 (2)公平锁RedissonFairLock 各个客户端尝试获取锁时会排队&#xff0c;按照队…

2025年渗透测试面试题总结-字某某动-安全研究实习生(一面)(题目+回答)

网络安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 字某某动-安全研究实习生&#xff08;一面&#xff09; 一、岗位认知与方向选择 1. 对公司业务的理解 …

Dify平台部署记录

安装dify项目 官网地址&#xff1a;http://difyai.com/ github地址&#xff1a;https://github.com/langgenius/dify 下载项目&#xff1a; git clone https://github.com/langgenius/dify.git下载过慢&#xff0c;直接访问网页下载zip压缩包&#xff1a; 解压&#xff0c;…

串口数据记录仪DIY,体积小,全开源

作用 产品到客户现场出现异常情况&#xff0c;这个时候就需要一个日志记录仪、黑匣子&#xff0c;可以记录产品的工作情况&#xff0c;当出现异常时&#xff0c;可以搜集到上下文的数据&#xff0c;从而判断问题原因。 之前从网上买过&#xff0c;但是出现过丢数据的情况耽误…

如何用HTML5 Canvas实现电子签名功能✍️

&#x1f916; 作者简介&#xff1a;水煮白菜王&#xff0c;一位资深前端劝退师 &#x1f47b; &#x1f440; 文章专栏&#xff1a; 前端专栏 &#xff0c;记录一下平时在博客写作中&#xff0c;总结出的一些开发技巧和知识归纳总结✍。 感谢支持&#x1f495;&#x1f495;&a…

Uniapp项目运行到微信小程序、H5、APP等多个平台教程

摘要&#xff1a;Uniapp作为一款基于Vue.js的跨平台开发框架&#xff0c;支持“一次开发&#xff0c;多端部署”。本文将手把手教你如何将Uniapp项目运行到微信小程序、H5、APP等多个平台&#xff0c;并解析常见问题。 一、环境准备 在开始前&#xff0c;请确保已安装以下工具…

Python设计模式 - 建造者模式

定义 建造者模式是一种创建型设计模式&#xff0c;主要用于构建包含多个组成部分的复杂对象。它将对象的构建过程与表示分离&#xff0c;使得同样的构建过程可以创建不同的对象表示。 结构 抽象建造者&#xff08;Builder&#xff09;&#xff1a;声明创建产品的各个部件的方…

音乐API

https://neteasecloudmusicapi.vercel.app/docs/#/https://neteasecloudmusicapi.vercel.app/docs/#/ 使用实例 所有榜单内容摘要 说明 : 调用此接口,可获取所有榜单内容摘要 接口地址 : /toplist/detail 调用例子 : /toplist/detail 获取歌单所有歌曲 说明 : 由于网易云…

Jetpack Compose — 入门实践

一、项目中使用 Jetpack Compose 从此节开始,为方便起见,如无特殊说明,Compose 均指代 Jetpack Compose。 开发工具: Android Studio 1.1 创建支持 Compose 新应用 新版 Android Studio 默认创建新项目即为 Compose 项目。 注意:在 Language 下拉菜单中,Kotlin 是唯一可…

【day12】进程切换与调度:linux系统的幕后操控术

【Day12】进程切换与调度&#xff1a;linux系统的幕后操控术 进程优先级进程属性&#xff1a;UID进程属性&#xff1a;PRI和NI进程饥饿 竞争/独立/并行/并发进程切换进程调度&#xff08;O(1)调度算法&#xff09; 进程优先级 进程优先级的本质&#xff1a;衡量进程得到CPU资源…

STM32之BKP

VBAT备用电源。接的时候和主电源共地&#xff0c;正极接在一起&#xff0c;中间连接一个100nf的电容。BKP是RAM存储器。 四组VDD都要接到3.3V的电源上&#xff0c;要使用备用电池&#xff0c;就把电池正极接到VBAT&#xff0c;负极跟主电源共地。 TEMPER引脚先加一个默认的上拉…

mapbox高阶,结合threejs(threebox)添加管道

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️threebox Tube静态对象二、🍀使用thr…

Android15使用FFmpeg解码并播放MP4视频完整示例

效果: 1.编译FFmpeg库: 下载FFmpeg-kit的源码并编译生成安装平台库 2.复制生成的FFmpeg库so文件与包含目录到自己的Android下 如果没有prebuiltLibs目录,创建一个,然后复制 包含目录只复制arm64-v8a下

利用FatJar彻底解决Jar包冲突(三)

利用FatJar彻底解决Jar包冲突 Spring 容器的加载与隔离⽀持注解配置⽂件定位与容器初始化嵌套Spring容器的加载 隔离优化EagleEye traceId不⼀致问题原因解决 Spring 容器的加载与隔离 ⽀持注解 这个⽐较容易&#xff0c;主要是我们之前的应⽤不⽀持⼆⽅包内部的注解&#xf…

ThinkPHP8.0+MySQL8.0搭建简单实用电子证书查询系统

客户花了100元买了一个系统&#xff0c;开始不能导入&#xff0c;到处找人帮忙解决。给解决能导入了&#xff0c;不能修改&#xff0c;满足不了用户的需求。用户一狠心&#xff0c;花200块钱&#xff0c;叫我给他定制了一个电子证书查询系统。还免费给部署到服务器。惭愧惭愧……

越早越好!8 个反直觉的金钱真相|金钱心理学

很多人都追求财富自由&#xff0c;但成功的人少之又少。 这可能是因为&#xff0c;人们往往忽略了一些金钱的真相和常识。 01 金钱常识 & 真相 为了构建健康的金钱观&#xff0c;我读了一本有点反直觉&#xff0c;有点像鸡汤&#xff0c;但都是财富真相的书。 来自 Morg…

文本转语音-音画适时推送rtsp并播放

文本语音 rtsp适时播放叫号系统的底层逻辑 发布Linux, unix socket 和window win32做为音频源的 python10下的(ffmpeg version 7.1) 可运行版本. 这两天在弄这个&#xff0c;前2篇是通过虚拟声卡&#xff0c;达到了最简单的一个逻辑&#xff0c;播放文本就从声卡发声&#xff0…

类和对象(中)

1.类的6个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。空类中真的什么都没有吗&#xff1f;并不是&#xff0c;任何类在什么都不写时&#xff0c;编译器会自动生成以下6个默认成员函数。默认成员函数&#xff1a;用户没有显式实现&#xff0c;编译器会生成…