vue3 - 内置组件KeepAlive优化组件状态缓存

文章目录

    • [1. `KeepAlive` 的基本用法](#1. KeepAlive 的基本用法)
    • [2. `KeepAlive` 的工作原理](#2. KeepAlive 的工作原理)
    • [3. `KeepAlive` 的属性](#3. KeepAlive 的属性)
      • [3.1. `include` 和 `exclude`](#3.1. includeexclude)
      • [示例:`include` 和 `exclude`](#示例:includeexclude)
      • 解释:
      • [3.2. `max` 属性](#3.2. max 属性)
      • 示例:`max`
      • 解释:
    • [4. `KeepAlive` 的生命周期钩子](#4. KeepAlive 的生命周期钩子)
      • [示例:使用 `activated` 和 `deactivated`](#示例:使用 activateddeactivated)
      • 解释:
    • [5. `KeepAlive` 的应用场景](#5. KeepAlive 的应用场景)

KeepAlive 是 Vue 提供的一个内置组件,主要用于 缓存 组件的状态。当组件被切换时, KeepAlive 可以保持组件的状态,而不是销毁并重新创建它们,适用于页面切换时 需要保留状态 的场景,如表单、输入框等内容。从而提升应用性能并改善用户体验。

在 SPA(单页应用)中,通常有许多页面或视图,用户在不同页面之间切换时,默认情况下组件会被销毁并重新创建。这样做虽然能保证每次进入页面时都渲染最新的内容,但如果某些页面的状态非常复杂,或者页面中有大量的数据加载与计算,那么每次切换都重新创建组件可能会导致性能问题。

1. KeepAlive 的基本用法

示例:基础用法

vue 复制代码
<template>
  <div>
    <button @click="currentPage = 'page1'">Page 1</button>
    <button @click="currentPage = 'page2'">Page 2</button>

    <keep-alive>
      <component :is="currentPage" />
    </keep-alive>
  </div>
</template>

<script>
import Page1 from "./Page1.vue";
import Page2 from "./Page2.vue";

export default {
  components: { Page1, Page2 },
  data() {
    return {
      currentPage: "page1"
    };
  }
};
</script>

解释:

  • KeepAlive 包裹住 component,从而缓存 Page1Page2 组件的状态。
  • 当用户切换页面时,Page1Page2 不会被销毁,而是会被缓存,保留其状态。

2. KeepAlive 的工作原理

Vue 通过 KeepAlive 组件为 动态组件 提供缓存支持。当组件被包裹在 KeepAlive 中时,它会缓存已经渲染的组件实例。下次访问该组件时,Vue 会 复用已缓存的组件,而不是重新创建新的实例。

工作流程:

  1. 组件渲染时,KeepAlive 会通过 缓存机制 维护每个动态组件的实例。
  2. 当组件离开视图时,KeepAlive 会将该组件的实例保存到内存中。
  3. 组件再次进入视图时,KeepAlive复用缓存的实例,并恢复它的状态。

3. KeepAlive 的属性

KeepAlive 组件提供了一些 属性,以控制缓存的行为。

3.1. includeexclude

  • include:指定缓存哪些组件。可以使用字符串、正则表达式或数组来指定。
  • exclude :指定不缓存哪些组件,功能与 include 类似。

这两个属性可以让你 灵活控制哪些组件应该被缓存,哪些组件应该被排除

示例:includeexclude

vue 复制代码
<template>
  <div>
    <button @click="currentPage = 'page1'">Page 1</button>
    <button @click="currentPage = 'page2'">Page 2</button>
    <button @click="currentPage = 'page3'">Page 3</button>

    <keep-alive :include="['page1']">
      <component :is="currentPage" />
    </keep-alive>
  </div>
</template>

<script>
import Page1 from "./Page1.vue";
import Page2 from "./Page2.vue";
import Page3 from "./Page3.vue";

export default {
  components: { Page1, Page2, Page3 },
  data() {
    return {
      currentPage: "page1"
    };
  }
};
</script>

解释:

  • include="['page1']" 只缓存 Page1 组件。当切换到 Page2Page3 时,它们不会被缓存。

3.2. max 属性

max 属性指定了 缓存的最大数量,当缓存数量超过这个数时,最旧的组件将被销毁。适用于有大量动态组件的情况,防止缓存过多组件占用内存。

示例:max

vue 复制代码
<template>
  <div>
    <button @click="currentPage = 'page1'">Page 1</button>
    <button @click="currentPage = 'page2'">Page 2</button>

    <keep-alive :max="2">
      <component :is="currentPage" />
    </keep-alive>
  </div>
</template>

解释:

  • max="2" 限制最多缓存 2 个组件,当缓存数达到上限时,最早的缓存组件会被销毁。

4. KeepAlive 的生命周期钩子

KeepAlive 中,组件在 激活 (进入视图)和 停用(离开视图)时,都会触发生命周期钩子。Vue 提供了两个生命周期钩子来帮助开发者处理缓存组件的状态:

  • activated:当组件被激活并添加到 DOM 时调用。
  • deactivated:当组件被停用并从 DOM 中移除时调用。

这些钩子通常用于 重置组件的状态清理资源

示例:使用 activateddeactivated

vue 复制代码
<template>
  <keep-alive>
    <component :is="currentPage" />
  </keep-alive>
</template>

<script>
import { ref } from "vue";
import Page1 from "./Page1.vue";
import Page2 from "./Page2.vue";

export default {
  components: { Page1, Page2 },
  data() {
    return {
      currentPage: ref("page1")
    };
  },
  methods: {
    activated() {
      console.log(`${this.currentPage} activated`);
    },
    deactivated() {
      console.log(`${this.currentPage} deactivated`);
    }
  }
};
</script>

解释:

  • activateddeactivated 会在组件进入和离开视图时分别触发,你可以在这两个钩子中做一些状态重置或清理操作。

5. KeepAlive 的应用场景

KeepAlive 主要用于 需要频繁切换的组件,例如:

  • 页面切换:在多页面应用中,切换页面时不希望丢失某些页面的状态。
  • 表单:在表单页面中,表单的输入状态可能需要保留。
  • 选项卡式布局:在选项卡布局中,切换选项卡时不希望重新加载每个选项卡的内容。

示例:常见应用

假设有一个应用,包含多个页面,用户切换页面时,应用通过 KeepAlive 来保持页面状态,而不是重新加载页面。

vue 复制代码
<template>
  <div>
    <keep-alive :include="['page1', 'page2']">
      <component :is="currentPage" />
    </keep-alive>
  </div>
</template>

<script>
import { ref } from "vue";
import Page1 from "./Page1.vue";
import Page2 from "./Page2.vue";
import Page3 from "./Page3.vue";

export default {
  components: { Page1, Page2, Page3 },
  data() {
    return {
      currentPage: ref("page1")
    };
  }
};
</script>

在这个例子中,只有 Page1Page2 被缓存,Page3 每次切换时都会重新加载。


👉点击进入 我的网站

相关推荐
mengzhi啊9 小时前
缓存类CacheDataManager把临时数据存入json。做成插件·
qt·缓存·json
CharlesYu019 小时前
前端性能优化的第一性原理,是不断缩短“用户发起意图 → 获得可用结果”之间的时间
前端
Bs_MoneyMagnet9 小时前
基于springboot+vue的医疗健康便民服务平台的设计与实现 源码+文档
java·vue.js·spring boot·后端·spring
平头哥技术团队10 小时前
Day 21 _ 页内锚点_给每段起个 id,目录写 href=_#id_,点一下页面就滚到那一段
前端·html·html5
子兮曰11 小时前
Bun v1.4.1 深度解析:从 Zig 到 Rust,一场 11 天、64 个 AI 代理的语言迁徙
前端·后端·bun
人民广场吃泡面11 小时前
什么是AI Agent?它又能给前端带来哪些效率提升?
前端·人工智能
中科三方11 小时前
两家域名注册商资质被ICANN终止:企业域名资产安全再受关注
前端·网络·安全·域名
bug总结12 小时前
uniapp vue3全局方法注册使用
前端·javascript·uni-app
华无丽言12 小时前
如何在宜搭中实现获取子表中的字段值赋值到父表中?
前端·javascript·低代码
小lu飞12 小时前
DeepSeek Flash 降价的技术账本:缓存友好型定价如何改写推理成本结构
缓存