Vue中Keep-Alive缓存组件使用语法及深度解析

一、Keep-alive 是什么

keep-alive是vue中的内置组件,能在组件切换过程中将状态保留在内存中,防止重复渲染DOM

keep-alive包裹动态组件时,会缓存不活动的组件实例,而不是销毁它们

keep-alive可以设置以下props属性

  • include - 字符串或正则表达式。只有名称匹配的组件会被缓存
  • exclude - 字符串或正则表达式。任何名称匹配的组件都不会被缓存
  • max - 数字。最多可以缓存多少组件实例

关于keep-alive的基本用法:

<keep-alive>
  <component :is="view"></component>
</keep-alive>

使用includesexclude

<keep-alive include="a,b">
  <component :is="view"></component>
</keep-alive>

<!-- 正则表达式 (使用 `v-bind`) -->
<keep-alive :include="/a|b/">
  <component :is="view"></component>
</keep-alive>

<!-- 数组 (使用 `v-bind`) -->
<keep-alive :include="['a', 'b']">
  <component :is="view"></component>
</keep-alive>

匹配首先检查组件自身的 name 选项,如果 name 选项不可用,则匹配它的局部注册名称 (父组件 components 选项的键值),匿名组件不能被匹配

设置了 keep-alive 缓存的组件,会多出两个生命周期钩子(activated与deactivated):

  • 首次进入组件时:beforeRouteEnter > beforeCreate > created > mounted > activated > … … > beforeRouteLeave > deactivated
  • 再次进入组件时:beforeRouteEnteractivated > … … > beforeRouteLeave > deactivated
export default {
    activated() {
        // 组件被激活时执行的逻辑
    },
    deactivated() {
        // 组件被停用时执行的逻辑
    }
}

 

二、使用场景

使用原则:当我们在某些场景下不需要让页面重新加载时我们可以使用keepalive

举个栗子:

当我们从 首页 –> 列表页 –> 商详页 –> 再返回,这时候列表页应该是需要keep-alive

首页 –> 列表页 –> 商详页 –> 返回到列表页(需要缓存) –> 返回到首页(需要缓存) –> 再次进入列表页(不需要缓存),这时候可以按需来控制页面的keep-alive

在路由中设置keepAlive属性判断是否需要缓存

{
  path: 'list',
  name: 'itemList', // 列表页
  component (resolve) {
    require(['@/pages/item/list'], resolve)
 },
 meta: {
  keepAlive: true,
  title: '列表页'
 }
}

使用<keep-alive>

<div id="app" class='wrapper'>
    <keep-alive>
        <!-- 需要缓存的视图组件 --> 
        <router-view v-if="$route.meta.keepAlive"></router-view>
     </keep-alive>
      <!-- 不需要缓存的视图组件 -->
     <router-view v-if="!$route.meta.keepAlive"></router-view>
</div>

三、思考题:缓存后如何获取数据

解决方案可以有以下两种:

  • beforeRouteEnter

  • actived

beforeRouteEnter

每次组件渲染的时候,都会执行beforeRouteEnter

beforeRouteEnter(to, from, next){
    next(vm=>{
        console.log(vm)
        // 每次进入路由执行
        vm.getData()  // 获取数据
    })
},

actived

keep-alive缓存的组件被激活的时候,都会执行actived钩子

activated(){
   this.getData() // 获取数据
},
注意:服务器端渲染期间avtived不被调用。
<think>首先,用户的问题是:“我想了解Vuekeep-alive组件的最大缓存数量 请问vue keep-alive 最大缓存组件数量”。这直接询问了keep-alive组件的最大缓存数量。 根据系统级指令,我需要: - 使用$...$格式的行内数学表达式(如果有的话)。 - 独立公式使用$$...$$格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 在回答中引用的段落末尾添加引用标识。 用户提供了几个引用: - 引用[1]:关于keep-alive的基本使用- 引用[2]:提到max属性,可以设置最大缓存组件的上限。 - 引用[3]:关于activated和deactivated钩子函数。 - 引用[4]:详细解释了keep-alive的属性,包括max属性,它指定最大缓存数量,默认无限制。 - 引用[5]:在Vue3中,keep-alive的include、exclude和max属性。 关键点是引用[4]和[5]: - 引用[4]说:“max 规定最大能缓存组件的数量,默认是没有限制的”。 - 引用[5]说:“max:最大可缓存的数量”。 所以,在Vue中,keep-alive组件的最大缓存数量是通过max属性设置的,默认情况下是没有限制的,但可以通过设置max属性来指定一个上限。 用户的问题具体是“最大缓存组件数量”,我需要明确回答: - 默认最大缓存数量:无限制。 - 可以通过max属性设置最大缓存数量。 在回答中,我需要结构化: - 回答要清晰,逐步解决问题。 - 引用相关部分,末尾添加引用标识。 - 最后生成相关问题。 回答结构: 1. 介绍keep-alive组件的用途。 2. 解释最大缓存数量。 3. 说明如何设置max属性。 4. 添加引用。 然后,生成相关问题。 确保使用中文。 最终回答: - 开头:直接回答用户问题。 - 主体:详细解释。 - 结束:生成相关问题。</think>### Vuekeep-alive组件的最大缓存数量 在Vue中,`keep-alive`组件用于缓存动态组件或路由组件,避免重复创建和销毁,从而提高应用性能。关于最大缓存组件数量的问题,核心点如下: 1. **默认最大缓存数量**: `keep-alive`组件默认没有缓存数量上限。这意味着,如果不手动设置限制,它会缓存所有符合条件的组件实例,直到应用关闭或组件被手动销毁。这可能导致内存占用过高,因此在实际开发中建议根据需求设置上限[^4]。 2. **通过`max`属性设置最大缓存数量**: 您可以使用`max`属性来指定最大缓存组件的数量。这是一个可选的数字类型属性: - 语法:`<keep-alive :max="number"></keep-alive>`,其中`number`是一个正整数。 - 例如,设置最大缓存10个组件: ```html <keep-alive :max="10"> <component :is="currentComponent" /> </keep-alive> ``` - 工作原理:当缓存组件数量超过`max`值时,`keep-alive`会基于“先进先出”(FIFO)原则自动移除最早缓存组件,确保新组件被添加时总数不超过上限[^4][^5]。 3. **注意事项**: - `max`属性仅限制缓存实例的数量,不影响组件的渲染逻辑。 - 结合`include`和`exclude`属性可以更精细地控制缓存范围(如只缓存特定组件),避免不必要的内存消耗[^5]。 -Vue 3中,`keep-alive`的行为与Vue 2一致,但需注意API兼容性[^5]。 **总结**:Vue的`keep-alive`最大缓存组件数量默认无限制,但通过`max`属性可自定义上限(例如`:max="10"`)。合理设置此值能平衡性能与内存使用[^4][^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值