浅谈vue中的keep-alive

我们先来了解一下keep-alive的概念

  1. <keep-alive>是vue的内置组件,可以使被包裹的组件保留状态,避免重新渲染
  2. <keep-alive>包裹动态组件时,会缓存不活动的组件实例,而不是销毁他们。和 <transition> 相似,<keep-alive> 是一个抽象组件:它自身不会渲染一个 DOM 元素,也不会出现在组件的父组件链中
  3. 当组件在 <keep-alive> 内被切换,它的 activateddeactivated 这两个生命周期钩子函数将会被对应执行,activated是在keep-alive组件激活时调用,deactivated是在keep-alive组件停用时调用
  4. props:
    1. include - 字符串或正则表达式。只有名称匹配的组件会被缓存。
    2. exclude - 字符串或正则表达式。任何名称匹配的组件都不会被缓存。
    3. max - 数字。最多可以缓存多少组件实例。

具体用法

export default {
	name: keep-alive-test,
	data() {
		return {
			includeComponent: 'keep-alive-test'
		}
	}
}

<-- 缓存name为keep-alive-test的组件 -->
<keep-alive include="keep-alive-test">
	<component><component>
</keep-alive>

<-- 缓存name为a或者b的组件 -->
<keep-alive include="keep-alive-test">
	<component :is="view"><component>
</keep-alive>

<-- 缓存name为a或者b的组件,使用正则表达式,需使用v-bind -->
<keep-alive include="/a|b/">
	<component :is="view"><component>
</keep-alive>

<-- 动态判断 -->
<keep-alive :include="includeComponent">
	<reouter-view><reouter-view>
</keep-alive>

<keep-alive :max="10">
	<reouter-view><reouter-view>
</keep-alive>

<-- 不缓存name为keep-alive-test组件 -->
<keep-alive exclude="keep-alive-test">
	<component><component>
</keep-alive>



activated和deactivated钩子函数,由于keep-alive包裹组件时,会缓存不活动的组件实例,而不是销毁它们,所以我们在路由切换时,缓存的组件是不会被销毁的,所以在destroyed中加入销毁事件是不会被执行的,这是就需要用到两个钩子函数

// keep-alive钩子函数,组件恢复时触发
activated() {
	window.addEventListener('scroll', this.scroll)
}
// keep-alive钩子函数,组件变为不可用时触发
deactivated() {
	window.removeEventListener('scroll', this.scroll)
}

activated和deactivated这两个钩子函数只有被keep-alive包裹才会被调用,在vue2.1.0 版本之后使用了exclude排除后,就算是被keep-alive包裹这两个钩子也不会调用,另外在服务端渲染时钩子函数也不会被调用。

页面首次进入被keep-alive包裹的组件时,钩子函数的触发顺序是created --> mounted – > actived – >deactivated,当之后在进入时,只会触发activated,离开触发deactivated

因为keep-alive回缓存数据,所以在第一次进入之后数据不会重新解析,而是直接读取内存中的数据。因此我们因该在activated中留一份数据获取的代码

Vuekeep-alive是一种用于缓存组件的机制。它可以将组件进行包裹,以便在组件切换时保留其状态和避免重新渲染。在使用keep-alive时,我们可以将要缓存的组件放在<keep-alive>标签,如下所示: <keep-alive> <component></component> </keep-alive>[2] 此时,被包裹的组件在切换时将不会被销毁,而是保留在内存。这样可以提高组件的切换性能。 另外,我们还可以结合v-if指令来控制keep-alive的缓存行为。例如,在路由设置meta属性的keepAlive为true时,使用<keep-alive>标签进行缓存,否则不进行缓存,如下所示: <keep-alive> <router-view v-if="$route.meta.keepAlive" /> </keep-alive> <router-view v-if="!$route.meta.keepAlive" /><span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Vue keep-alive 详解](https://blog.csdn.net/ZYS10000/article/details/122480733)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* [Vuekeep-alive原理](https://blog.csdn.net/weixin_43804496/article/details/125523619)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值