vue中keep-alive1

76 阅读3分钟

vue中keep-alive的详细讲解(建议收藏)

一、Keep-alive 是什么

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

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

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

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

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

max - 数字。用于指定缓存组件的最大数量,超过这个数量时,最久未被访问的组件会被移除。

  1. 状态保留:在组件切换过程中,保留组件的状态和数据。

  2. 性能优化:通过避免不必要的重新渲染,提高应用性能。

  3. 生命周期钩子:提供了activated和deactivated两个生命周期钩子,方便开发者在组件激活和停用时执行特定操作。

关于keep-alive的基本用法

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

使用includes和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>

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

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

  • 首次进入组件时:beforeRouteEnter > beforeCreate > created> mounted > activated > ... ... > beforeRouteLeave > deactivated

  • 再次进入组件时:beforeRouteEnter >activated > ... ... > beforeRouteLeave > deactivated

二、使用场景

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

举个栗子:

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

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

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

  1. 路由组件:在多页面切换时,保留用户的输入和页面状态。
  2. 动态组件:在频繁切换的动态组件中,避免重复加载和初始化。
  3. 表单:在表单页面切换时,保留用户输入的数据。
{
    path: 'list',
    name: 'itemList', // 列表页
    component(resolve) {
        require(['@/pages/item/list'], resolve)
    },
    meta: {
        keepAlive: true,
        title: '列表页'
    }
}

使用

<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不被调用

六、性能优化

通过使用keep-alive,可以显著提升应用的性能,尤其是在以下情况下:

  1. 复杂表单:避免用户在切换页面后丢失表单数据。
  2. 数据加载:避免重复的数据加载和处理,提高响应速度。
  3. 动画:在复杂动画场景下,避免重复计算和渲染。

参考1

参考2