Vue中的keep-alive缓存组件的理解

这篇具有很好参考价值的文章主要介绍了Vue中的keep-alive缓存组件的理解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

<keep-alive> 是一个抽象组件,用于将其内部的组件保留在内存中,而不会重新渲染。这意味着当组件在<keep-alive> 内部切换时,其状态将被保留,而不是被销毁和重新创建。

         <keep-alive>用来缓存不经常变化的组件,以提高性能,当我们在不同路由之间进行切换或者是动态改变组件时,<keep-alive>可以确保被缓存的组件保留之前的一个状态,而不会重新执行created和mounted等生命周期钩子函数。
        那么<keep-alive>会提供activateddeactivated 生命周期钩子函数的应用,这两个生命周期钩子函数是在缓存组件时或失去缓存组件时进行的触发。

        activated钩子函数叫做激活状态,也就是组件当被激活的时候进行的调用,这时候组件从<keep-alive>缓存中变为一个激活的状态,将会再次的插入到页面当中进行一个渲染显示。

        deactivated钩子函数是当缓存的组件失去我们的活力调用时触发,这时组件从页面当中移除并且从新添加到<keep-alive>缓存当中。

那么我们可以在activated钩子中进行内部数据的初始化操作,而在deactivated钩子中进行数据的清理以确保每次被激活时都有正确的一个状态,如果组件处于一些外部服务的应用,比如websocked连接,或者定时器操作等等,则可以在activated中开始或启动的一个服务,在deactivated当中关闭或停止某些服务,以避免浪费一些无效的一些资源,那么我们可以在组件切换的时候添加一些自定义的过渡或动画的效果,这样可以通过activated以及deactivated钩子中去触发我们的动画效果或者是相应的业务逻辑来进行实现。

总的来说,activated和deactivated生命周期钩子函数为我们提供了在缓存的组件状态变换时执行一些特殊的业务逻辑的一个操作功能。

        那么对于<keep-alive>来说,除了生命周期钩子函数的一个影响,还有其他属性的一个设置,比如include exclude 属性的设置. 主键的include和exclude属性是用于配置那些主键是用来缓存,那些组件是不应该被缓存,而它们的属性可以接收的数据类型,主要包括了字符串,正则表达式或字符串的数组内容。

原理:缓存函数中的max,也就是最大值,它采用的并不是队列,而是LRU(缓存淘汰策略)

LRU (Least Recently Used) 是一种缓存淘汰策略用于在缓存容量不足时确定哪些数据项被移除。其基本思想是保留最近被访问过的数据,而淘汰最长时间没有被访问的数据。LRU算法通过维护一个访问顺序列表来实现这个目标。

(LRU的思想就是保留最近被访问的数据,而淘汰最长时间未被访问的数据,那么LRU算法通过维护一个访问序列表来实现这个目标,例如:当一个数据项被访问的时候,我们会将其移动到顺序列表的头部,表示最近被使用过,当需要淘汰一个数据的时候,选择列表尾部的数据进行移除,这时表示没有被使用过的数据,这种方式保证了访问过的数据项保持在我们列表的头部,而不常访问的数据项逐渐会移动到我们列表的尾部,当需要淘汰数据的时候,只需要移除尾部的数据即可。)


以下是模拟LRU算法的一些代码示例:文章来源地址https://www.toymoban.com/news/detail-801953.html

<script>
    class LRUCache{
        constructor(capacity){
            this.capacity = capacity; // 缓存容量
            this.cache = new Map(); // 使用 Map 数据结构存储缓存数据,以键值对的形式保存
        }
 
        get(key) {
            if(this.cache.has(key)){ // 如果缓存中存在该键,则表示缓存命中
                const value = this.cache.get(key); // 获取对应键的值
                this.cache.delete(key); // 删除原有的键值对
                this.cache.set(key,value); // 将键值对重新放入缓存,保证最近使用的键值对在 Map 的末尾
                return value; // 返回获取到的值
            }else {
                return -1; // 如果缓存中不存在该键,则返回 -1 表示未命中
            }
        }
 
        put(key,value){
            if(this.cache.has(key)){ // 如果缓存中已经存在该键,则需要将其删除
                this.cache.delete(key);
            }else if(this.cache.size >= this.capacity){ // 如果缓存已满,需要删除最久未使用的键
                const oldestkey = this.cache.keys().next().value; // 获取 Map 中第一个键,即最久未使用的键
                this.cache.delete(oldestkey); // 删除最久未使用的键值对
            }
            this.cache.set(key,value); // 将新的键值对放入缓存
        }
    }
 
    const lruCache = new LRUCache(3); // 创建容量为 3 的 LRUCache 对象
 
    lruCache.put(1,1); // 将键值对 (1, 1) 放入缓存
    lruCache.put(2,2); // 将键值对 (2, 2) 放入缓存
    lruCache.put(3,3); // 将键值对 (3, 3) 放入缓存
 
    console.log(lruCache.get(1)); // 获取键为 1 的值,输出 1
 
    lruCache.put(4,4); // 将键值对 (4, 4) 放入缓存,此时缓存已满,需要删除最久未使用的键值对
 
    console.log(lruCache.get(2)); // 获取键为 2 的值,由于键 2 已经被删除,返回 -1
</script>

到了这里,关于Vue中的keep-alive缓存组件的理解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Vue使用keep-alive设置哪些组件可以被缓存,哪些不被缓存

    需求:当一个项目中,不是所有的组件页面都需要缓存起来,因为有些页面是不需要的    $route.meta.keepAlive 判断当前组件是否有keepAlive属性 在路由js文件中在配置路由规则的时候配置  

    2024年02月16日
    浏览(31)
  • vue3,动态引入组件,同时动态设置组件的name,用于keep-alive缓存

    如果有两个页面逻辑大都相同,咱们想到的第一个肯定是写一个组件,然后两个路由都指向这个组件。 那如果现在多添加一个需求:两个页面在切换路由时都需要缓存数据,并且两个页面的缓存数据要求独立。 这个需求很简单:在router-view外层包裹一个keep-alive组件,指定缓

    2024年02月14日
    浏览(36)
  • vue3,vite开发, 动态引入组件,同时动态设置组件的name,用于keep-alive缓存

    如果有两个页面逻辑大都相同,咱们想到的第一个肯定是写一个组件,然后两个路由都指向这个组件。 那如果现在多添加一个需求:两个页面在切换路由时都需要缓存数据,并且两个页面的缓存数据要求独立。 这个需求很简单:在router-view外层包裹一个keep-alive组件,指定缓

    2024年02月07日
    浏览(35)
  • VUE3,自定义控制keep-alive缓存

    安装插件 npm install vite-plugin-vue-setup-extend --save 在vite.config.ts中 import VueSetupExtend from \\\'vite-plugin-vue-setup-extend\\\' ..... plugins:[         vue(),         VueSetupExtend(),         ..... ] useKeepalive.ts import { ref } from \\\"vue\\\" export const includes = refstring[]([]); // 增加缓存 export function addKeepAliveC

    2024年01月19日
    浏览(21)
  • keep-alive 是 Vue 的一个内置组件,用于缓存其他组件的实例,以避免重复渲染和销毁,它可以在需要频繁切换的组件之间提供性能优化

    目录 keep-alive  使用 keep-alive 的示例代码: 手动清除组件缓存的示例代码: keep-alive 组件有以下几个优点: keep-alive 的原理: 使用 keep-alive 组件,你可以包裹需要缓存的组件,然后这些组件在切换时将会被缓存起来,而不是每次都重新创建。 使用 keep-alive 的示例代码: 我们

    2024年02月08日
    浏览(29)
  • Vue3 除了 keep-alive,还有哪些实现页面缓存的方法

    有这么一个需求:列表页进入详情页后,切换回列表页,需要对列表页进行缓存,如果从首页进入列表页,就要重新加载列表页。 对于这个需求,我的第一个想法就是使用keep-alive来缓存列表页,列表和详情页切换时,列表页会被缓存;从首页进入列表页时,就重置列表页数

    2024年02月06日
    浏览(30)
  • keep-alive组件缓存

    从 a跳b,a已经销毁,b重新渲染;b跳a,b销毁a重新渲染 源组件销毁,目标组件渲染 组件缓存:组件实例等相关(  包括vnode )存储起来 重新渲染指的是:把视图重新编译成新的vnode-dom diff-渲染成真实dom 真实dom被我移除了只是从页面上移除,只是把vnode重新渲染成真实dom或者

    2024年01月21日
    浏览(31)
  • vue3.0中的keep-alive

    keep-alive是vue中的一个内置组件,通常用它来包裹一个动态组件,keep-alive 包裹动态组件时,会缓存不活动的组件实例,而不是销毁它们。 它有两个特殊的生命周期钩子 activated 和 deactivated ,在vue3.0里面生命周期函数前面都要加上on, onActivated , onDeactivated 。当组件在使用了kee

    2023年04月08日
    浏览(27)
  • vue keep-alive 中的生命周期

    keep-alive 是 Vue 提供的一个内置组件,用来对组件进行缓存——在组件切换过程中将状态保留在内存中,防止重复渲染DOM。 如果为一个组件包裹了 keep-alive,那么它会多出两个生命周期:deactivated、activated。同时,beforeDestroy 和 destroyed 就不会再被触发了,因为组件 不会被真正

    2024年02月12日
    浏览(30)
  • 缓存滚动位置:解决keep-alive组件缓存滚动位置失败问题

    怎样在vue中缓存组件?大家都知道,使用keep-alive组件即可,但是使用keep-alive缓存页面后,发现虽然页面缓存成功了,但是列表的滚动条又自动回到了最上方。 是的, keep-alive组件是不会缓存滚动位置的 。 怎样缓存滚动位置呢?这是我们这一章讲的问题。 核心思想是在路由

    2024年02月16日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包