当前位置: 首页 > news >正文

Vue核心知识:KeepLive全方位分析

KeepAlive 是 Vue 组件中的一个重要功能,主要用于缓存组件,以提升性能和用户体验。

在这里插入图片描述

目录

      • 一、`KeepAlive` 基本概念
      • 二、`KeepAlive` 的核心原理
      • 三、`KeepAlive` 关键属性解析
        • 1. `include`:指定需要缓存的组件
        • 2. `exclude`:指定不需要缓存的组件
        • 3. `max`:最大缓存组件数
      • 四、`KeepAlive` 生命周期
      • 五、具体使用场景
      • 六、常见问题及解决方案
        • 1. **`activated` 和 `deactivated` 不触发**
        • 2. **`keep-alive` 组件缓存过多导致内存占用**
        • 3. **如何手动清除缓存**
        • 4. **如何手动清除 `keep-alive` 缓存**
      • 七、完整示例:结合 Vue Router
      • 八、总结


在这里插入图片描述

一、KeepAlive 基本概念

KeepAlive 是 Vue 内置的一个抽象组件,通常用于包裹动态组件,使其在切换时保持状态,而不是被销毁和重新创建。

主要作用:

  1. 缓存组件,避免重复创建和销毁,提升性能。
  2. 保持组件状态,例如表单填写、用户滚动位置等不会丢失。
  3. 适用于router-viewcomponent动态组件

基础使用示例:

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

<script>
import A from "./A.vue";
import B from "./B.vue";

export default {
  data() {
    return {
      currentView: "A"
    };
  },
  components: { A, B }
};
</script>

在上述代码中,<component :is="currentView">会根据currentView的值动态切换组件,但由于keep-alive的存在,被切换出去的组件不会被销毁,而是被缓存。


二、KeepAlive 的核心原理

  1. 组件挂载与缓存

    • Vue 在创建组件时,会判断是否被 KeepAlive 包裹,如果是,则不会销毁,而是将其存储在 cache 对象中。
    • 当组件被切换回来时,会从 cache 取出,而不会重新创建实例。
  2. 缓存管理

    • KeepAlive 组件通过 includeexclude 规则控制哪些组件需要缓存,哪些不需要。
  3. 生命周期钩子

    • activated():组件被缓存后激活时触发。
    • deactivated():组件被缓存但切换出去时触发。

三、KeepAlive 关键属性解析

1. include:指定需要缓存的组件

可以是字符串、正则表达式或数组:

<keep-alive :include="['A', 'B']">
  <router-view></router-view>
</keep-alive>

这样只有 AB 组件会被缓存。

2. exclude:指定不需要缓存的组件
<keep-alive :exclude="/^Temp/">
  <router-view></router-view>
</keep-alive>

所有以 Temp 开头的组件都不会被缓存。

3. max:最大缓存组件数
<keep-alive :max="2">
  <router-view></router-view>
</keep-alive>

最多缓存 2 个组件,超过后会删除最久未使用的组件。


四、KeepAlive 生命周期

组件被 keep-alive 缓存时,不会触发 createdmounted,但会触发以下钩子:

  1. activated():组件从缓存中激活
  2. deactivated():组件被缓存但未销毁

示例:

<script>
export default {
  created() {
    console.log("组件创建");
  },
  mounted() {
    console.log("组件挂载");
  },
  activated() {
    console.log("组件被激活");
  },
  deactivated() {
    console.log("组件被缓存");
  }
};
</script>

生命周期触发顺序

  • 首次进入createdmountedactivated
  • 切换离开deactivated
  • 再次进入activated

五、具体使用场景

  1. 配合 router-view,缓存某些路由

    <keep-alive>
      <router-view></router-view>
    </keep-alive>
    
    • 这样切换路由时,已访问的组件会被缓存。
  2. 结合 include 指定缓存页面

    <keep-alive :include="['Home', 'Profile']">
      <router-view></router-view>
    </keep-alive>
    
    • 只有 HomeProfile 页面会被缓存。
  3. 结合 exclude 过滤不需要缓存的页面

    <keep-alive :exclude="['Login']">
      <router-view></router-view>
    </keep-alive>
    
    • Login 页面不会被缓存,其他页面都会缓存。
  4. 动态组件缓存

    <keep-alive>
      <component :is="currentComponent"></component>
    </keep-alive>
    
    • 切换组件时不会销毁原组件。

六、常见问题及解决方案

1. activateddeactivated 不触发
  • 确保组件确实被 keep-alive 包裹,并且是动态组件。
2. keep-alive 组件缓存过多导致内存占用
  • 使用 max 限制缓存数:
    <keep-alive :max="3">
      <router-view></router-view>
    </keep-alive>
    
3. 如何手动清除缓存
this.$destroy(); // 清除当前组件缓存

或者

this.$parent.$forceUpdate(); // 强制更新
4. 如何手动清除 keep-alive 缓存

可以使用 key 强制重新渲染:

<keep-alive>
  <component :is="currentComponent" :key="currentKey"></component>
</keep-alive>

每次切换 currentKey,都会重新渲染组件。


七、完整示例:结合 Vue Router

<template>
  <div>
    <button @click="currentView = 'Home'">Home</button>
    <button @click="currentView = 'About'">About</button>

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

<script>
import Home from "./Home.vue";
import About from "./About.vue";

export default {
  data() {
    return {
      currentView: "Home"
    };
  },
  components: { Home, About }
};
</script>

在这里:

  • HomeAbout 组件可以自由切换,并且会被 keep-alive 缓存。

八、总结

  1. KeepAlive 主要用于缓存动态组件,避免重复创建和销毁,提高性能。
  2. 关键属性:
    • include 指定缓存组件。
    • exclude 排除不需要缓存的组件。
    • max 限制最大缓存数。
  3. 组件生命周期:
    • activated() 组件被激活
    • deactivated() 组件被缓存
  4. 适用于 router-viewcomponent 组件,适合缓存列表、表单、复杂页面状态。

如果在项目中正确使用 KeepAlive,可以大幅提升前端性能,避免页面状态丢失,提高用户体验。

相关文章:

  • shell场景题
  • 通往 AI 之路:Python 机器学习入门-语法基础
  • 基于51单片机超声波测量报警LCD1602显示( proteus仿真+程序+设计报告+讲解视频)
  • 塔子哥Python算法基础课
  • Conda 环境搭建实战:从基础到进阶
  • flutter AnimationController 动画使用总结
  • [创业之路-329]:华为铁三角实施的步骤
  • uiautomatorviewer定位元素报Unexpected ... UI hierarchy
  • stm32week5
  • 细说 Java 集合之 Map
  • 【机器学习chp10】降维——(核化)PCA + MDS + lsomap + 拉普拉斯特征映射 + t-NSE + UMAP
  • 【无标题】词源故事:role与roll的联系,词根horr(恐惧)与hair(毛发)关系
  • Python之参数星号(*)使用笔记
  • js基础二
  • JMeter 实战项目脚本录制最佳实践(含 BadBoy 录制方式)
  • Docker 常用指令手册(学习使用)
  • Skywalking介绍,Skywalking 9.4 安装,SpringBoot集成Skywalking
  • 16.11 LangChain SQL 生成与执行实战:构建安全高效的数据库查询引擎
  • DeepSeek如何快速开发PDF转Word软件
  • 【JAVA面试题】JDK、JRE、JVM 三者区别和联系
  • 这个死亡率第一的“老年病”,正悄悄逼近年轻人
  • 三人在共享单车上印小广告被拘,北京警方专项打击非法小广告
  • 19国入境团抵沪并游玩,老外震惊:“怎么能有这么多人?”
  • 人民日报头版:紧盯“学查改”,推动作风建设走深走实
  • 浙江广厦:诚挚道歉,涉事责任人交公安机关
  • 原核试验基地司令员范如玉逝世,从事核试验研究超40年