vue中keep-Alive 源码和原理

70 阅读1分钟

vue中keep-Alive 源码和原理

keep-alive 是 Vue 的内置组件,当它包裹动态组件时,会缓存不活动的组件实例,而不是销毁它们。 和 transition 相似,keep-alive 是一个抽象组件:它自身不会渲染成一个 DOM 元素,也不会出现在父组件链中。

1.作用

在组件切换过程中将状态保留在内存中,防止重复渲染DOM,减少加载时间及性能消耗,提高用户体验性。

2.原理

在 created 函数调用时将需要缓存的 VNode 节点保存在 this.cache 中/在 render(页面渲染) 时,如果 VNode 的 name 符合缓存条件(可以用 include 以及 exclude 控制),则会从 this.cache 中取出之前缓存的 VNode 实例进行渲染。 (VNode:虚拟DOM,其实就是一个JS对象)

3.使用

参数名 | 值 | 描述 |

| include | 字符串或正则表达式 | 只有名称匹配的组件会被缓存。|

| exclude | 字符串或正则表达式 | 任何名称匹配的组件都不会被缓存。|

| max | 数字 | 最多可以缓存多少组件实例。|

4.使用方式

1.在 App.vue 中使用 keep-alive 标签,表示缓存所有页面

<div id="app"> 
    <keep-alive>
        <router-view />
    </keep-alive> 
</div>

2.使用 include、exclude 判断是否要缓存组件

<!--1、缓存 name 为 projectManage 的组件,如果有多个,用逗号隔开-->
 <keep-alive include="projectManage">
	<router-view />
 </keep-alive>
<!-- 2、name 为 projectOverview 的组件将不会缓存 -->
<keep-alive exclude="projectOverview">
   <router-view />
</keep-alive>
 <!-- 3、使用属性绑定动态判断 -->
 <keep-alive :include="includedComs">
	<router-view />
 </keep-alive>

3.在 router 目录下的 index.js 文件中使用 3.1 第一步:使用 meta: { keepalive: true },表示该页面需缓存

{
   path: '/users',
   component: () => import('@/views/users/Users.vue'),
   meta: {
   	keepalive: true
   }
 },
 {
   path: '/rights',
   component: () => import('@/views/rights/Rights.vue')
 },

3.2 第二步:在 App.vue 文件中进行判断

<keep-alive> 
    <router-view v-if="$route.meta.keepalive" /> 
</keep-alive>

<router-view v-if="!$route.meta.keepalive" />

4.生命周期函数

  • activated
    1、在 keep-alive 组件激活时调用
    2、该钩子函数在服务器端渲染期间不被调用
  • deactivated
    1、在 keep-alive 组件停用时调用
    2、该钩子函数在服务器端渲染期间不被调用