Vue用keep-alive缓存组件

举报
空城机 发表于 2022/04/15 09:34:49 2022/04/15
【摘要】 keep-alive是vue中缓存动态组件的抽象组件,对于频繁切换的组件来说,为了避免消耗,可以使用keep-alive进行缓存,达到优化的效果

keep-alive

用途:对于动态切换的组件进行包裹,使其能够进行缓存,而不是销毁掉后重新创建

在系统开发中,界面上有时会需要对某一块内容进行切换,如果这一部分的内容是几个组件频繁动态切换,为了提高效率,可以使用keep-alive包裹它们。

keep-alive是一个抽象组件,本身不会渲染一个DOM元素,也不会出现在组件的组件链中。(这与transition动画组件类似)

实例

<template>
    <div class='keepAlives'>
        <keep-alive></keep-alive>
    </div>
</template>

虽然在代码中存在<keep-alive>,但是当打印this时,children中是不存在任何子组件的

在这里插入图片描述

如果引入一个普通子组件,children中会有的

在这里插入图片描述

在这里插入图片描述


activateddeactivated

Vue的生命周期当中,存在这样两个钩子activateddeactivated。这两个钩子与mounted钩子等不同,它们只为了keep-alive服务,如果vue组件中没有使用keep-alive,就不会被触发。

activated() {
    console.log('111加载缓存')
},
<button @click="state = 'a'" >111</button>
<br/>
<button @click="state = 'b'" >222</button>
<hr />
<br/>

<keep-alive>
    <keepAliveState1 v-if="state === 'a'"></keepAliveState1>
    <keepAliveState2 v-if="state === 'b'"></keepAliveState2>
</keep-alive>

效果:

在这里插入图片描述


比较

如果不使用keep-alive,子组件会发生什么操作? 被切换掉的组件会进行destroy销毁

mounted() {
    console.log('1111组件mounted');
},
destroyed() {
    console.log('111组件destroyed');
},
  • 不使用keep-alive
<keepAliveState1 v-if="state === 'a'"></keepAliveState1>
<keepAliveState2 v-if="state === 'b'"></keepAliveState2>

在这里插入图片描述

  • 使用keep-alive

可以看到,在keep-alive中的组件只会mounted加载一次,并且切换后也没有销毁,这样就是缓存了

在这里插入图片描述


属性

keep-alive 中还存在 includeexcludemax三种属性

  • include可以选择需要缓存的组件
  • exclude可以排除不需要缓存的组件
  • max限制最大缓存数量,如果已缓存的组件超过max,就像队列一样,先进先出,最先缓存的组件被销毁

只缓存1和3

keepArr: ['keepAliveState1', 'keepAliveState3']
<keep-alive :include="keepArr">
    <keepAliveState1 v-if="state === 'a'"></keepAliveState1>
    <keepAliveState2 v-if="state === 'b'"></keepAliveState2>
    <keepAliveState3 v-if="state === 'c'"></keepAliveState3>
</keep-alive>

在这里插入图片描述

动态组件

上面举的例子,切换组件如果多时,可以使用动态组件的写法

  • :is = "component-name" 用法
  • 需要根据数据,动态渲染的场景。 即组件类型不确定
<button @click="state = 'keepAliveState1'" >111</button>
<br/>
<button @click="state = 'keepAliveState2'" >222</button>
<br/>
<button @click="state = 'keepAliveState3'" >333</button>

<hr />
<br/>

<keep-alive>
    <component :is="state"></component>
</keep-alive>
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。