Top
Fork me on Gitee My Github

Vue -- 谈谈你对 keep-alive 的了解?

keep-alive 官方文档

keep-alive 是系统自带的一个组件

主要用于保留组件状态或避免重新渲染(提升性能)。

Props:

  1. include - 字符串或正则表达式。只有名称匹配的组件会被缓存。
  2. exclude - 字符串或正则表达式。任何名称匹配的组件都不会被缓存。
  <!-- 逗号分隔字符串 -->
  <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>
  1. max - 数字。最多可以缓存多少组件实例。
<keep-alive :max="10">
 <component :is="view"></component>
</keep-alive>

用法:

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

<keep-alive> 不会在函数式组件中正常工作,因为它们没有缓存实例。

注意:使用 include 和 exclude 属性时,缓存组件的名称 name 一定要赋值,否则无法识别到对应的路由组件。

具体实现比如:首页进入详情页,如果用户在首页点击都是相同的,那么详情页就没有必要请求N次了,直接存起来就可以了,当然如果点击的不是同一个,那么就直接请求;列表进入详情页,详情页返回列表页,列表页不重新请求数据,保留之前的数据和滚动位置。

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

<!-- 多个条件判断的子组件 -->
<keep-alive>
  <comp-a v-if="a > 1"></comp-a>
  <comp-b v-else></comp-b>
</keep-alive>

<!-- 和 `<transition>` 一起使用 -->
<transition>
  <keep-alive>
    <component :is="view"></component>
  </keep-alive>
</transition>

<!-- 结合Router 缓存部分页面 $route.meta.keepAlive 选项 -->
<keep-alive>
   <router-view v-if="$route.meta.keepAlive" />
</keep-alive>
<router-view v-if="!$route.meta.keepAlive" />

<router-view v-slot="{ Component }">
   <keep-alive>
      <component :is="Component"></component>
   </keep-alive>
</router-view>

相关生命周期:

beforeCreated 啥也没有
created 有data没有el
beforeMount 有data没有el
mounted 都有

如果加入了keep-alive

  1. 会多两个生命周期 activated deactivated

  2. 第一次进入组件会执行哪些生命周期

beforeCreated
created
beforeMount
mounted
activated

  1. 第二次或者第N次进入组件会执行哪些生命周期?

只执行一个生命周期 activated

posted @ 2022-08-30 16:14  lisashare  阅读(65)  评论(0编辑  收藏  举报