vue中keep-alive组件的使用

keep-alive是vue的内置组件,它的主要作用是对组件进行缓存,避免组件在切换时被重复创建和销毁,从而提高应用的性能和用户体验。它自身不会渲染一个 DOM 元素,也不会出现在父组件链中。使用时,只需要将需要缓存的组件包裹在keep-alive标签内即可。

使用

首先声明两个组件keepCompont1.vue,keepCompont2.vue 

<template><div><p>这是 keepCompont1</p><input v-model="inputValue" placeholder="输入内容"></div></template><script>export default {data() {return {inputValue: ''};},created() {console.log('keepCompont1 created');},mounted() {console.log('keepCompont1 mounted');},activated() {console.log('keepCompont1 activated');},deactivated() {console.log('keepCompont1 deactivated');},destroyed() {console.log('keepCompont1 destroyed');}};</script><style scoped></style>
<template><div><p>这是 keepCompont2</p><input v-model="inputValue" placeholder="输入内容"></div></template><script>export default {data() {return {inputValue: ''};},created() {console.log('keepCompont2 created');},mounted() {console.log('keepCompont2 mounted');},activated() {console.log('keepCompont2 activated');},deactivated() {console.log('keepCompont2 deactivated');},destroyed() {console.log('keepCompont2 destroyed');}};</script><style scoped></style>

生命周期里面打印了信息来确认那些生命周期执行了,activated和deactivated是keep-alive组件特有的生命周期,组件被激活执行activated,组件隐藏的时候执行deactivated。对于vue生命周期不理解的可以看下这里,详细说了下生命周期的作用和执行顺序。vue生命周期和应用

父组件代码:

<template><div><button @click="toggleComponent">切换组件</button><keep-alive ><!-- is绑定的值即为当前显示的组件,需要切换的时候需要动态绑定。  --><component :is="currentComponent"></component></keep-alive></div>
</template><script>
import keepCompont1 from "@/components/keepCompont1.vue";
import keepCompont2 from "@/components/keepCompont2.vue";
export default {components: {keepCompont1,keepCompont2,},data() {return {// 默认显示keepCompont1组件currentComponent: "keepCompont1",};},methods: {// 修改currentComponent的值来切换组件toggleComponent() {//  this.currentComponent === 'keepCompont2' ? 'keepCompont1' : 'keepCompont2'; //  三元运算符做了一个判断 //  this.currentComponent === 'keepCompont2'为true //  则把keepCompont1 赋值给this.currentComponent。false则把keepCompont2赋值过去this.currentComponent = this.currentComponent === 'keepCompont2' ? 'keepCompont1' : 'keepCompont2';},},
};
</script>

运行效果:

当页面加载完成后可以看到keepCompont1组件的created,mounted,activated生命周期函数执行了。

keepCompont1组件的输入框输入内容1111,点击切换按钮。keepCompont2组件显示出来且created,mounted,activated生命周期函数执行且keepCompont1组件隐藏了且执行了deactivated

 然后我们来验证keepCompont1组件刚才输入的内容1111 是否缓存上了,这里在组件2的输入框里面输入222,然后点击切换按钮。

切换回来后可以看到输入框里面的1111还在,并且从打印的生命周期上可以看到destroyed钩子函数并没有执行也就是说没有销毁在重新创建组件。 在次点击切换按钮可以看到组件2里面的2222也是存在的。整个过程destroyed钩子函数都没有执行

keep-alive组件有三个常用的属性:include,exclude,max

 include

include值为字符串或正则表达式,只有名称匹配的组件会被缓存,如果不使用include属性则默认缓存所有。这里在创建一个keepCompont3组件,内容和keepCompont1和keepCompont2一样的唯一区别就是修改下生命周期的打印,这里就不在粘贴重复的代码了。稍微修改下父组件

<template><div><button @click="toggleComponent">切换组件</button><!-- 添加一个按钮 用来显示组件3 --><button @click="show3">显示组件3</button><keep-alive include="keepCompont1,keepCompont2"><!-- is绑定的值即为当前显示的组件,需要切换的时候需要动态绑定。  --><component :is="currentComponent"></component></keep-alive></div>
</template><script>
import keepCompont1 from "@/components/keepCompont1.vue";
import keepCompont2 from "@/components/keepCompont2.vue";
import keepCompont3 from "@/components/keepCompont3.vue";
export default {components: {keepCompont1,keepCompont2,keepCompont3},data() {return {// 默认显示keepCompont1组件currentComponent: "keepCompont1",};},methods: {// 修改currentComponent的值来切换组件toggleComponent() {// this.currentComponent === 'keepCompont2' ? 'keepCompont1' : 'keepCompont2'; 三元运算符做了一个判断 //  this.currentComponent === 'keepCompont2'为true 则把keepCompont1 赋值给this.currentComponent。// false则把keepCompont2赋值过去this.currentComponent = this.currentComponent === 'keepCompont2' ? 'keepCompont1' : 'keepCompont2';},show3(){this.currentComponent = 'keepCompont3'}},
};
</script>

这里include没有包含keepCompont3组件,当组件3隐藏在出现的时候不会缓存输入框里面的值,因为组件被销毁了,执行了destroyed生命周期函数

这里可以看到当最后进入组件3的时候,组件3的created钩子函数也执行了,说明组件又重新创建了。

exclude

值为字符串或正则表达式,名称匹配的组件不会被缓存。

 <keep-alive include="keepCompont1,keepCompont2,keepCompont2" exclude="keepCompont2"><!-- is绑定的值即为当前显示的组件,需要切换的时候需要动态绑定。  --><component :is="currentComponent"></component></keep-alive>

运行效果

max 

值为数字,最多可以缓存多少组件实例。假如存储的实例大于设置的数字,则会触发LUR淘汰机制。比如:假如设置最大缓存数量为2,先切换到了组件1和组件2,此时组件1,组件2会被缓存,当切换到组件3的时候,由于已经到了最大缓存数量,组件1和组件2中最久没有使用的那个组件实例会被淘汰。

LRU 算法的核心思想是:当缓存空间满了需要淘汰一个元素时,会选择最久没有被访问过的元素进行淘汰。

end

后续更新一些keep-alive组件的使用场景demo(如有误欢迎指正)

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

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

相关文章

Python Excel表格数据对比工具

【Excel对比工具】提升工作效率的神奇助手&#xff1a;基于PyQt5和Pandas的文件数据对比应用 相关资源文件已经打包成EXE文件&#xff0c;可双击直接运行程序&#xff0c;且文章末尾已附上相关源码&#xff0c;以供大家学习交流&#xff0c;博主主页还有更多Python相关程序案例…

注册登录表单

html登录页面&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>创建一个登录页面</t…

JAVA:Spring Boot @Conditional 注解详解及实践

1、简述 在 Spring Boot 中&#xff0c;Conditional 注解用于实现 条件化 Bean 装配&#xff0c;即根据特定的条件来决定是否加载某个 Bean。它是 Spring 框架中的一个扩展机制&#xff0c;常用于实现模块化、可配置的组件加载。 本文将详细介绍 Conditional 相关的注解&…

Java高频面试之集合-17

hello啊&#xff0c;各位观众姥爷们&#xff01;&#xff01;&#xff01;本baby今天来报道了&#xff01;哈哈哈哈哈嗝&#x1f436; 面试官&#xff1a;JDK 8 对 HashMap 主要做了哪些优化呢&#xff1f;为什么要这么做&#xff1f; JDK 8 对 HashMap 的主要优化及原因 JDK…

力扣DAY24 | 热100 | 回文链表

前言 简单 √ 是反转链表的衍生题&#xff0c;很快写完了。不过没考虑到恢复链表结构的问题。 题目 给你一个单链表的头节点 head &#xff0c;请你判断该链表是否为回文链表。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例 1&#xff1a; 输…

Unity跨平台构建快速回顾

知识点来源&#xff1a;人间自有韬哥在&#xff0c;豆包 目录 一、发布应用程序1. 修改发布必备设置1.1 打开设置面板1.2 修改公司名、游戏项目名、版本号和默认图标1.3 修改 Package Name 和 Minimum API Level 2. 发布应用程序2.1 配置 Build Settings2.2 选择发布选项2.3 构…

手敲NLP相关神经网络,熟悉神经网络的结构与实现!

一、NNLM 二、word2vec 三、TextCNN 四、TextRNN 五、TextLSTM 六、Bi-LSTM 七、seq2seq 八、seq2seq&#xff08;attention&#xff09;

Spring MVC 拦截器使用

javaweb过滤器和springmvc拦截器&#xff1a; 拦截器的概念 拦截器使用 1/创建拦截器类&#xff0c;类中实现 handler执行前&#xff0c;执行后与渲染视图后的具体实现方法 public class GlobalExceptionHandler implements HandlerInterceptor {// if( ! preHandler()){re…

数据库分类、存储引擎、介绍、Mysql、SQL分类

DAY17.1 Java核心基础 数据库 关系型数据库&#xff08;传统数据库&#xff0c;安全可靠&#xff0c;数据量大&#xff09;&#xff1a;Mysql、Oracle、SQLServer 非关系型数据库nosql&#xff08;缓存数据库&#xff0c;高并发项目中&#xff0c;存储热点数据&#xff0c;短信…

Extend module 01:Keyboard

目录 一、Keyboard &#xff08;1&#xff09;资源介绍 &#x1f505;原理图 &#x1f505;扫描原理 &#xff08;2&#xff09;STM32CubeMX 软件配置 &#xff08;3&#xff09;代码编写 &#xff08;4&#xff09;实验现象 二、Keyboard接口函数封装 三、踩坑日记 &a…

【机器人】复现 GrainGrasp 精细指导的灵巧手抓取

GrainGrasp为每个手指提供细粒度的接触指导&#xff0c;为灵巧手生成精细的抓取策略。 通过单独调整每个手指的接触来实现更稳定的抓取&#xff0c;从而提供了更接近人类能力的抓取指导。 论文地址&#xff1a;GrainGrasp: Dexterous Grasp Generation with Fine-grained Con…

解锁 AWX+Ansible 自动化运维新体验:快速部署实战

Ansible 和 AWX 是自动化运维领域的强大工具组合。Ansible 是一个简单高效的 IT 自动化工具&#xff0c;而 AWX 则是 Ansible 的开源 Web 管理平台&#xff0c;提供图形化界面来管理 Ansible 任务。本指南将带你一步步在 Ubuntu 22.04 上安装 Ansible 和 AWX&#xff0c;使用 M…

Vulhub-jangow-01-1.0.1通关攻略

第0步&#xff1a; 打开靶机&#xff0c;按下shift&#xff0c;出现下图界面 在此页面按下e键&#xff0c;进入如下界面&#xff0c; 将ro 替换为 rw signie init/bin/bash 替换完毕后&#xff0c;按下Ctrl键X键&#xff0c;进入如下页面 ip a查看网卡信息 编辑配置文件网卡信…

默克生命科学 | ProClin™安全、高效防腐剂

ProClin™防腐剂是水溶性抗菌剂&#xff0c;是体外诊断(IVD)行业中最有效的抗菌剂之一&#xff0c;广泛应用于行业领先的诊断生产商的1,000多种FAD注册IVD试剂盒。低工作浓度下&#xff0c;ProClin™产品有效快速地抑制广谱微生物&#xff0c;有助于延长IVD试剂的保质期。 有别…

const应用

最近学校的花开了&#xff0c;选了一张三号楼窗前的白玉兰&#xff0c;(#^.^#) 1.修饰普通变量 当 const 用于修饰普通变量时&#xff0c;该变量的值在初始化之后就不能再改变。 #include <stdio.h>int main() {const int num 10;// num 20; // 错误&#xff0c;不…

FastStoneCapture下载安装教程(附安装包)专业截图工具

文章目录 前言FastStoneCapture下载FastStoneCapture安装步骤FastStoneCapture使用步骤 前言 在日常工作与学习里&#xff0c;高效截图工具至关重要。本教程将为你呈现FastStoneCapture下载安装教程&#xff0c;助你轻松拥有。 FastStoneCapture下载 FastStone Capture 是一款…

3. 轴指令(omron 机器自动化控制器)——>MC_ResetFollowingError

机器自动化控制器——第三章 轴指令 13 MC_ResetFollowingError变量▶输入变量▶输出变量▶输入输出变量 功能说明▶指令详情▶时序图▶重启动运动指令▶多重启运动指令▶异常 MC_ResetFollowingError 对指令当前位置和反馈当前位置的偏差进行复位。 指令名称FB/FUN图形表现S…

【HTML5游戏开发教程】零基础入门合成大西瓜游戏实战 | JS物理引擎+Canvas动画+完整源码详解

《从咖啡杯到财务自由&#xff1a;一个程序员的合成之旅——当代码遇上物理引擎的匠心之作》 &#x1f31f; 这是小游戏开发系列的第四篇送福利文章&#xff0c;感谢一路以来支持和关注这个项目的每一位朋友&#xff01; &#x1f4a1; 文章力求严谨&#xff0c;但难免有疏漏之…

举例说明自然语言处理(NLP)技术

当我们使用智能助手或社交媒体平台时&#xff0c;就会接触到自然语言处理&#xff08;NLP&#xff09;技术的应用。以下是一些常见的例子&#xff1a; 语音识别&#xff1a;当我们与智能助手如Siri、Alexa或Google Assistant交互时&#xff0c;我们说出语音命令&#xff0c;系统…

ResNet与注意力机制:深度学习中的强强联合

引言 在深度学习领域&#xff0c;卷积神经网络&#xff08;CNN&#xff09;一直是图像处理任务的主流架构。然而&#xff0c;随着网络深度的增加&#xff0c;梯度消失和梯度爆炸问题逐渐显现&#xff0c;限制了网络的性能。为了解决这一问题&#xff0c;ResNet&#xff08;残差…