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,可以大幅提升前端性能,避免页面状态丢失,提高用户体验。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/72273.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【电力——tarjan割点,求连通块】

题目 分析 这是割点的板子 代码 #include <bits/stdc.h> using namespace std;const int N 1e410; const int M 3e410;int h[N], e[M], ne[M], idx; int dfn[N], low[N], tot; int root, ans;void add(int a, int b) // 添加一条边a->b {e[idx] b, ne[idx] h…

【HTTP】解码网络通信的奥秘:HTTP,IP 地址,端口,DNS及NAT地址转换的协同之舞

引言 每文学习一句诗&#xff1a;行一棋不足以见智&#xff0c;弹一弦不足以见悲 ——《淮南子说林训》 译文&#xff1a;走一个棋子&#xff0c;不足以现出智慧&#xff1b;弹一根琴弦&#xff0c;不能够使人产生悲哀之情。 自述&#xff1a;互联网现如今已经成为每个人都离不…

18、深拷贝与浅拷贝的区别【中高频】

浅拷贝 浅拷贝只是拷贝了一个指针&#xff0c;并没有开辟一块新的内存。拷贝的指针和原来的指针 指向同一块地址。当一个对象修改了资源&#xff0c;另一个对象也会受到影响&#xff0c;因此浅拷贝是有风险的&#xff1a;当两个对象都销毁 并调用析构函数时&#xff0c;会造成…

【Linux】从入门到精通:Make与Makefile完全指南

欢迎来到 CILMY23 的博客 &#x1f3c6;本篇主题为&#xff1a;从入门到精通&#xff1a;Make与Makefile完全指南 &#x1f3c6;个人主页&#xff1a;CILMY23-CSDN博客 &#x1f3c6;系列专栏&#xff1a;C | C语言 | Linux | Python | 数据结构和算法 | 算法专题 &#x1…

利用PyQt简单的实现一个机器人的关节JOG界面

在上一篇文章中如何在Python用Plot画出一个简单的机器人模型&#xff0c;我们介绍了如何在Python中画出一个简单的机器人3D模型&#xff0c;但是有的时候我们需要通过界面去控制机器人每一个轴的转动&#xff0c;并实时的显示出当前机器人的关节位置和末端笛卡尔位姿。 那么要实…

iOS 使用消息转发机制实现多代理功能

在iOS开发中&#xff0c;我们有时候会用到多代理功能&#xff0c;比如我们列表的埋点事件&#xff0c;需要我们在列表的某个特定的时机进行埋点上报&#xff0c;我们当然可以用最常见的做法&#xff0c;就是设置代理实现代理方法&#xff0c;然后在对应的代理方法里面进行上报&…

XGBoost和LightGBM机器学习算法对比及实战

文章目录 1. XGBoost 原理核心思想关键技术点2. LightGBM 原理核心思想关键技术点3. XGBoost vs LightGBM 对比4. 适用场景选择5. 总结1. 数据准备2. XGBoost 示例安装库代码实现3. LightGBM 示例安装库代码实现4. 关键参数对比5. 注意事项6. 输出示例XGBoost 和 LightGBM 是两…

局域网自动识别机器名和MAC并生成文件的命令

更新版本&#xff1a;添加了MAC 地址 确定了设备唯一性 V1.1 局域网自动识别机器名和MAC并生成文件的批处理命令 echo off setlocal enabledelayedexpansionREM 设置输出文件 set outputFilenetwork_info.txtREM 清空或创建输出文件 echo Scanning network from 192.168.20.1…

基于Python+Vue开发的体育用品商城管理系统源码+开发文档+课程作业

项目简介 该项目是基于PythonVue开发的体育用品商城管理系统&#xff08;前后端分离&#xff09;&#xff0c;这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Python编程技能&#xff0c;同时锻炼他们的项目设计与开发能力。通过学习基于Python的体…

pyQT5简易教程(一):制作一个可以选择本地图片并显示的桌面应用

可以参考之前的教程安装 PyQt 和 PyQt Designer https://blog.csdn.net/smx6666668/article/details/145909326?spm=1011.2415.3001.10575&sharefrom=mp_manage_link 一、打开pycharm中的QTdesigner 二、设计界面 和之前一样,使用 PyQt Designer 来设计界面并保存为 .u…

LeetCode 解题思路 6(Hot 100)

解题思路&#xff1a; 初始化窗口元素&#xff1a; 遍历前 k 个元素&#xff0c;构建初始单调队列。若当前索引对应值大于等于队尾索引对应值&#xff0c;移除队尾索引&#xff0c;将当前索引加入队尾。遍历结束时当前队头索引即为当前窗口最大值&#xff0c;将其存入结果数组…

基于redis的位图实现签到功能

基于Redis位图实现签到功能是一种高效且节省内存的方法。以下是分步实现的详细方案&#xff1a; 1. 键设计策略 采用 sign:<userId>:<YYYYMM> 格式存储每月签到数据 # 示例&#xff1a;用户1001在2023年8月的签到数据 sign_key "sign:1001:202308"2.…

C++ Qt OpenGL渲染FFmpeg解码后的视频

本篇博客介绍使用OpenGL渲染FFmpeg解码后的视频,涉及到QOpenGLWidget、QOpenGLFunctions、OpenGL shader以及纹理相关,播放效果如下: 开发环境:Win11 C++ Qt6.8.1、FFmpeg4.0、x64   注意:Qt版本不同时,Qt OpenGL API及用法可能差别比较大,FFmpeg版本不同时API调用可能…

deepseek部署:ELK + Filebeat + Zookeeper + Kafka

## 1. 概述 本文档旨在指导如何在7台机器上部署ELK&#xff08;Elasticsearch, Logstash, Kibana&#xff09;堆栈、Filebeat、Zookeeper和Kafka。该部署方案适用于日志收集、处理和可视化场景。 ## 2. 环境准备 ### 2.1 机器分配 | 机器编号 | 主机名 | IP地址 | 部署组件 |-…

2.数据结构:1.Tire 字符串统计

1.Tire 字符串统计 #include<algorithm> #include<cstring> #include<iostream>using namespace std;const int N100010; int son[N][26];//至多 N 层&#xff0c;每一层至多 26 个节点&#xff08;字母&#xff09; int cnt[N];//字符串至多 N 个&#xff…

算法(四)——位运算与位图

文章目录 位运算、位图位运算基本位运算异或运算交换两个数无比较返回最大值缺失的数字唯一出现奇数次的数唯二出现奇数次的数唯一出现次数少于m次的数 位运算进阶判断一个整数是不是2的幂判断一个整数是不是3的幂大于等于n的最小的2的幂[left, right]内所有数字&的结果反转…

本地部署deepseek大模型后使用c# winform调用(可离线)

介于最近deepseek的大火&#xff0c;我就在想能不能用winform也玩一玩本地部署&#xff0c;于是经过查阅资料&#xff0c;然后了解到ollama部署deepseek,最后用ollama sharp NUGet包来实现winform调用ollama 部署的deepseek。 本项目使用Vs2022和.net 8.0开发&#xff0c;ollam…

SpringBoot原理-02.自动配置-概述

一.自动配置 所谓自动配置&#xff0c;就是Spring容器启动后&#xff0c;一些配置类、bean对象就自动存入了IOC容器当中&#xff0c;而不需要我们手动声明&#xff0c;直接从IOC容器中引入即可。省去了繁琐的配置操作。 我们可以首先将spring项目启动起来&#xff0c;里面有一…

P10265 [GESP样题 七级] 迷宫统计

题目描述 在神秘的幻想⼤陆中&#xff0c;存在着 n 个古老而神奇的迷宫&#xff0c;迷宫编号从 1 到 n。有的迷宫之间可以直接往返&#xff0c;有的可以⾛到别的迷宫&#xff0c;但是不能⾛回来。玩家小杨想挑战⼀下不同的迷宫&#xff0c;他决定从 m 号迷宫出发。现在&#x…

Spring框架中的工厂模式

在Spring框架里&#xff0c;工厂模式的运用十分广泛&#xff0c;它主要帮助我们创建和管理对象&#xff0c;让对象的创建和使用分离&#xff0c;提高代码的可维护性和可扩展性。下面为你详细介绍Spring框架中工厂模式的具体体现和示例&#xff1a; 1. BeanFactory 作为工厂模式…