Hi FE !
Ai
git
前端面试题
前端小tip
  • vite
  • webpack
npm
  • vue2
  • vue3
react
GitHub
Ai
git
前端面试题
前端小tip
  • vite
  • webpack
npm
  • vue2
  • vue3
react
GitHub
  • V010-vue中的keep-alive介绍下吧

V010-vue中的keep-alive介绍下吧

使用场景:

如果需要频繁切换路由,这个时候就可以考虑用keep-alive了,来达到避免数据的重复请求的目的

作用:

keep-alive用来缓存组件,避免多次加载相应的组件,减少性能消耗。 简单一点来说就是从页面A链接到其他页面后回退到页面A不用在重新执行页面A的created生命周期的代码,只会从缓存中加载之前已经缓存的页面A

几个参数:

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

一、用法介绍 keep-alive是一个内置组件和类似 keep-alive组件提供了include与exclude两个属性来允许组件有条件地进行缓存,二者都可以用逗号分隔字符串、正则表达式或一个数组来表示 keep-alive提供了两个生命钩子,分别是activated与deactivated。因为keep-alive会将组件保存在内存中,并不会销毁以及重新创建,所以不会重新调用组件的created等方法,需要用activated与deactivated这两个生命钩子来得知当前组件是否处于活动状态。 第一次为调取缓存的加载顺序,开启了keep-alive后,当再次进入(前进或者后退)时,只触发activated,退出时触发deactivated。 beforeCreate->created->beforeMount-> mounted-> activated

如何使用呢?

使用router. meta属性

//router.js文件路由设置
{
    path: '/keep_alive_test',
    component: () => import('@/views/keepAliveTest.vue'),
    meta: {
        title: 'keepAlive测试',
        keepAlive: true//使用(通过路由meta的keepAlive属性决定那个页面使用缓存)
    }
},

//App.vue文件
	<keep-alive :include="'componentA'">
		<router-view v-if="$route.meta.keepAlive"/>
	</keep-alive>
	<router-view v-if="!$route.meta.keepAlive"/>

使用include,exclude属性(不需要设置路由,需要设置组件名字,这里组件名字非路由组件名而是定义组件的名称)

//App.vue文件
<keep-alive :include="pages" exclude="componentB">
	<router-view/>
</keep-alive>
data () {
	return {
		pages: ['componentA', 'componentC']
	}
}

//这里的component组件内容就会被缓存,name为componentA\componentC的组件将会被缓存。name为componentB的组件将不会被缓存。 //!!!!include和exclude的组件名字必须是组件定义的name

注意事项

keep-alive组件使用针对的是页面组件!!!! 使用keep-alive 的组件不会再次触发created钩子函数 使用keep-alive,调用 $destory() 需要谨慎,否则页面不再被缓存 include 和exclude的组件名字必须是组件定义的name,而不是路由里面定义的名字

总结:


用了这个组件后就没有组件就没有created生命周期了。

vue可以使用keep-alive包裹一个动态路由组件,包裹之后,动态组件的状态会被缓存。如果使用动态组件渲染的某个组件使用了created生命周期请求数据,那么下次进入该组件不会再次请求数据。

因为keep-alive之后,所有的动态组件都会被缓存,被缓存之后的组件再次进入就不会执行created,如果想要每次进入数据都有更新或是更新操作,就应该使用activated生命周期来代替created。

router的生命周期不受keep-alive的影响。

原理总结

keep-alive 是一个Vue内置组件,主要用于缓存组件实例,避免重复创建和销毁,提高性能。(*不会渲染出 DOM 元素,也不会出现在父组件链中)。它的底层实现主要依靠以下几个关键部分:

缓存机制:keep-alive 内部使用一个对象 cache 来存储缓存的组件实例,键是组件的唯一标识key,值就是对应组件的虚拟节点vNode。同时,使用一个数组keys 来维护这些实例缓存顺序

而每个缓存顺序通过 LRU 算法进行维护,当缓存的组件数量超过max 属性指定的上限时,会优先移除最久未使用的组件实例。 另外,keep-alive 还会在组件声明周期中添加activated 和 deactivated 钩子,当组件被激活时触发activated,被缓存时触发deactivated,并且不会再触发mounted 和 unmounted 钩子。

最后,核心代码逻辑是在keep-alive 的render 函数里面,会获取默认插槽的第一个组件节点,再根据include 和exclude 属性判断是否需要缓存该组件。若需要缓存,就检查cache 中是否已有该组件实例,有则直接从缓存获取,没有则添加到缓存里。

keep-alive 内置组件,可以使组件在切换时保持状态,避免重新渲染。

可以通过 include 和 exclude 属性来指定需要缓存的组件。

可以缓存 、列表渲染、组件缓存等。

需要缓存的组件push 到include 数组中,不需要缓存的组件push 到exclude 数组中。

Edit this page
最近更新: 2025/12/2 01:46
Contributors: qdleader
qdleader
本站总访问量 129823次 | 本站访客数 12人