vue学习---vue内置组件---keep-alive

news/2024/10/3 12:38:38

什么是keep-alive?

​ keep-alive是vue的一个 内置组件,能将不活动的组件实例保存在内存中,而不是直接将其销毁,它是一个抽象组件,不会被渲染到真实 DOM 中。keep-alive主要用于保存组件的渲染状态,避免组件反复创建和渲染,有效提升系统性能。
 

keep-alive核心LRU算法

LRU( least recently used)算法根据数据的历史记录来移除不常用的数据。

重点:保护最近被访问或使用过的数据、淘汰现阶段最久未被使用过的数据

如下图所示:

 

代码实现://LRU.jsclass LRUCache {

    constructor(cacheNum) {this.maxCache = cacheNumthis.CacheKey = new Map()}// 获取key,不存在返回-1、存在则更新位置
    get(key) {if (this.CacheKey.has(key)) {// 获取值更新位置const value = this.CacheKey.get(key)
// 先移除再设置实现更新位置
       this.Cachekey.delete(key)
this.CacheKey.set(key, value)return value}return -1}// 添加缓存 put(key, value) {if (this.CacheKey.has(key)) {// 存在则移除,最后再通过set添加更新位置this.CacheKey.delete(key)} else if (this.CacheKey.size >= this.maxCache) {// next()迭代器获取当前值和是否迭代完的标志位// 这里是移除长期没用的this.CacheKey.delete(this.CacheKey.keys().next().value)}this.CacheKey.set(key, value)}log() {console.log('cacheKey:', this.CacheKey)} }export default LRUCache
//main.js

import lru from './LRU.js'const cacheObj = new lru(3)
cacheObj.log()   //Map(0) {size: 0}
cacheObj.put('key1', 'value1')  
cacheObj.put('key2', 'value2')
cacheObj.put('key3', 'value3')
cacheObj.log()    //Map(3) {'key1' => 'value1', 'key2' => 'value2', 'key3' => 'value3'}    
cacheObj.put('key4', 'value4')
cacheObj.log()    //Map(3) {'key2' => 'value2', 'key3' => 'value3', 'key4' => 'value4'}

keep-alive源码分析:

1、pruneCache用于遍历include和exclude来更新缓存

2、pruneCacheEntry用于清除不需要缓存的组件(注:1、清除缓存中的组件实例;2、调用组件$destory()卸载组件,前提是当前要移除的缓存组件不是已渲染的)

 

 

3、cacheVnode函数用于在updated后对组件进行缓存(在updated中进行缓存能够保证组件实例状态是最新的)

 4、render函数

 

 总结:

keep-alive核心就是将vue生成的vnode节点进行缓存处理。将include/exclude中满足的节点在cache中进行缓存,需要重新渲染的时候再取出并渲染。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

【闲话】OI计划

教练让的。顺手水一期闲话嘻嘻分数目标 1.1 初赛:S组60 1.2 复赛:S组150+ 1.3 NOIP:150+规划 2.1 9.1~9.10:复习图论,做完最短路题单 2.2 9.10~9.20:复习组合数学和代码阅读 2.3 9.22~10.25:学习数论、复习线段树等常用模板 2.4 10.27~11.29:总复习,背诵《骗分导论》(…

C# 定时器 Timer 如何精确到 1-2 毫秒以内

最近在排查项目OTA的一个问题,触发了一毫秒或者2毫秒执行一次进程间通信的,导致通信阻塞的问题。这样就需要用到模拟触发1ms或者2ms触发事件。这让我第一时间想到了C#的定时器。由于我们项目用到的框架是基于.NETFramwork4.8的,所以我就建立了一个.NETFramwork4.8的WPF Demo…

浅谈 Occupancy

01 研究意义 Occupancy Network算法因为可以更好的克服感知任务中存在的长尾问题,以及更加准确表达物体的几何形状信息,而受到来自工业界和学术界越来越广泛的关注。 Occupancy Network算法本质上是一个3D分割任务,通过将想要感知的3D空间划分成固定大小的体素网格,并让算法…

BEVFormer开源算法逐行解析(一):Encoder部分

写在前面: 对于BEVFormer算法框架的整体理解,大家可以找到大量的资料参考,但是对于算法代码的解读缺乏详实的资料。因此,本系列的目的是结合代码实现细节、在tensor维度的变换中帮助读者对算法能有更直观的认识。 本系列我们将对BEVFormer公版代码(开源算法)进行逐行解析…

MySQL的索引原理及使用

B+树的最底层叶子节点包含了所有的索引项。从图上可以看到,B+树在查找数据的时候,由于数据都存放在最底层的叶子节点上,所以每次查找都需要检索到叶子节点才能查询到数据。所以在需要查询数据的情况下每次的磁盘的IO跟树高有直接的关系,但是从另一方面来说,由于数据都被放…

first-blog

各位师傅好,这里是saga131的博客 原本打算第一个博客就介绍一下自己,在github上搭建了一个博客,但是遇到了点环境问题,便转战至博客园,用第二个博客来介绍一下自己本人是从2023年10月入门CTF和取证。社团纳新面试中,我选择了密码方向,开始了crypto之路。面试结束后,CPP…

压缩大型语言模型(LLMs):缩小10倍、性能保持不变

尽管LLMs的巨大规模使其在广泛的应用场景中表现卓越,但这也为其在实际问题中的应用带来了挑战。本文将探讨如何通过压缩LLMs来应对这些挑战。我们将介绍关键概念,然后通过具体的Python代码实例进行演示。2023年人工智能领域的主导思想是"更大即更好",改进语言模型的方…

Winserver 阴影会话,远程协助相关

场景(方便管理协助其他远程会话)用户都是运行在winserver 上的一个一个远程会话,有时需要看一下客户操作了什么。换做本地客户端的情况,可以让客户开远程工具。 方式1:远程协助 有一个轻松连接,这个目前没弄出来。效果跟金万维的一样,只要知道对方IP、计算机名。还有6位…