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.mzph.cn/diannao/74465.shtml

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

相关文章

Kafka拦截器

文章目录 1.定义2.生产者拦截器2.1 示例 3.消费者拦截器3.1 示例 1.定义 拦截器主要用于实现clients端的定制化需求&#xff0c;包括消息在生产者发送到 Kafka 或者在消费者接收消息之前进行一些定制化的操作。用于在消息发送和接收的关键步骤中进行拦截和处理。可以修改消息&…

进程间通信(匿名管道) ─── linux第22课

目录 进程间通信 进程间通信目的 进程间通信的发展 进程间通信分类 1. 管道 2. System V IPC 3. POSIX IPC 管道 什么是管道 站在文件描述符角度-深度理解管道 站在内核角度-管道本质 ​编辑 匿名管道 测试匿名管道的读写 匿名管道的四大现象&#xff1a; 匿…

架构思维:通用系统设计方法论_从复杂度分析到技术实现指南

文章目录 Question订单履约原始架构痛点目标架构架构图说明关键设计点优点 设计方法论复杂来源解决方案评估标准从设计原则出发 技术实现 &#xff08;以选型Redis为例&#xff09;Redis消息队列的实现细节高可用设计 总结 Question 我们经常聊如何设计一个比较完善的系统&…

Excel(实战):INDEX函数和MATCH函数、INDEX函数实战题

目录 经典用法两者嵌套查值题目解题分析 INDEX巧妙用法让数组公式&#xff0c;自动填充所有、有数据的行/列INDEX函数和SEQUENCE函数 经典用法两者嵌套查值 题目 根据左表查询这三个人的所有数据 解题分析 INDEX函数的参数&#xff1a;第1个参数是选定查找范围&#xff0c…

ECharts仪表盘-仪表盘25,附视频讲解与代码下载

引言&#xff1a; ECharts仪表盘&#xff08;Gauge Chart&#xff09;是一种类似于速度表的数据可视化图表类型&#xff0c;用于展示单个或多个变量的指标和状态&#xff0c;特别适用于展示指标的实时变化和状态。本文将详细介绍如何使用ECharts库实现一个仪表盘&#xff0c;…

解决安卓so库异常无法打印堆栈的问题

解决方案&#xff1a; 设置 android:extractNativeLibs"true" 直接在 AndroidManifest.xml 里加上&#xff1a; <applicationandroid:extractNativeLibs"true"> </application>这样&#xff0c;so 文件会被解压&#xff0c;崩溃时可以正常打…

清华大学.智灵动力-《DeepSeek行业应用实践报告》附PPT下载方法

导 读INTRODUCTION 今天分享是由清华大学.智灵动力&#xff1a;《DeepSeek行业应用实践报告》&#xff0c;主要介绍了DeepSeek模型的概述、优势、使用技巧、与其他模型的对比&#xff0c;以及在多个行业中的应用和未来发展趋势。为理解DeepSeek模型的应用和未来发展提供了深入的…

屏幕刷新机制(一):机制

屏幕刷新机制&#xff08;一&#xff09;&#xff1a;机制 屏幕刷新机制&#xff08;二&#xff09;&#xff1a;Choreographer、SurfaceFlinger 综述 屏幕整体刷新机制&#xff1a;就是通过Choreographer、SurfaceFlinger&#xff0c;以垂直同步技术(VSYNC)加三重缓冲技术(T…

VSCODE上ckg_server_linux进程占用CPU过多

现象描述 每次一打开VSCODE&#xff0c;ckg_server_linux进程就启动了&#xff0c;并且一直运行&#xff0c;且占用CPU过高&#xff1b; 推测应该是某个插件的问题导致的&#xff1b; 问题处理 本地搜索了一下&#xff0c;发现是 marscode插件影响的&#xff1b; 禁用marsc…

【大模型理论篇】CogVLM:多模态预训练语言模型

1. 模型背景 前两天我们在《Skywork R1V: Pioneering Multimodal Reasoning with Chain-of-Thought》中介绍了将ViT与推理模型结合构造多模态推理模型的案例&#xff0c;其中提到了VLM的应用。追溯起来就是两篇前期工作&#xff1a;Vision LLM以及CogVLM。 今天准备回顾一下Cog…

Vue 项目编译错误:These dependencies were not found,To install them, you can run...

问题与处理策略 问题描述 运行一个 Vue 项目时&#xff0c;报如下错误 ERROR Failed to compile with 47 errors …

python 模拟登录

在Python中模拟登录通常涉及到发送HTTP请求到服务器&#xff0c;并处理响应。这可以通过多种方式实现&#xff0c;最常见的方法之一是使用requests库。下面是一个简单的示例&#xff0c;展示了如何使用requests库来模拟登录一个网站&#xff08;以一个假想的登录表单为例&#…

优化 Docker 镜像 技巧

优化 Docker 镜像可以提高构建速度、减少镜像大小、提高安全性和效率。以下是一些优化 Docker 镜像的方法&#xff1a; 使用适当的基础镜像 选择合适的基础镜像可以减小镜像大小&#xff0c;并确保基础镜像的安全性和更新性。Alpine、Ubuntu Minimal 等轻量级基础镜像是常用选…

2021年蓝桥杯第十二届CC++大学B组真题及代码

目录 1A&#xff1a;空间&#xff08;填空5分_单位转换&#xff09; 2B&#xff1a;卡片&#xff08;填空5分_模拟&#xff09; 3C&#xff1a;直线&#xff08;填空10分_数学排序&#xff09; 4D&#xff1a;货物摆放&#xff08;填空10分_质因数&#xff09; 5E&#xf…

Python入门基础

python基础类型转换 str()与int()类型转换 name 张三 age 20 print(type(name),type(age))print(我叫name 今年&#xff0c; str(age)岁 )a10 b198.8 cFalse print(type(a),type(b),type(c)) print(str(a),str(b),str(c))s1 128 f198.7 s276.77 ffTrue s3hello print(type(s…

HTTP/HTTPS 中 GET 请求和 POST 请求的区别与联系

一、基础概念 HTTP (HyperText Transfer Protocol, 超文本传输协议) 是一种用于浏览器与服务器之间进行数据交互的协议。HTTPS (加密的 HTTP) 则通过 SSL/TLS 协议实现通信加密与数据安全性。 二、GET 和 POST 概述 GET 请求: 用于从服务器获取资源。 POST 请求: 用于将数据…

OPENCV数字识别(非手写数字/采用模板匹配)

这篇文章的重点在于 模板匹配 的使用。模板匹配是计算机视觉中的一项基本技术&#xff0c;它通过比对输入图像与模板图像的相似度&#xff0c;来进行目标识别。对于数字识别&#xff0c;特别是标准数字的识别&#xff0c;模板匹配非常有效。 请看效果&#xff1a; 文章结构 …

在 Kubernetes 中部署 Trivy 漏洞扫描服务

创建专用 Namespace # trivy-ns.yaml apiVersion: v1 kind: Namespace metadata: name: trivy-system配置持久化存储&#xff08;缓存数据库&#xff09; apiVersion: v1 kind: PersistentVolumeClaim metadata: name: trivy-db-cache namespace: trivy-system spec: acc…

Cursor安装注册+基础配置+入门实操

一、安装注册 官网地址&#xff1a;https://www.cursor.com/ 下载按钮会根据电脑系统来匹配&#xff0c;点击对应「Download」按钮进行下载。完成后&#xff0c;按步骤安装即可。 安装完成后&#xff0c;即可点击图标打开软件。 基础设置完成后&#xff0c;就需要选择注册账号…

秒杀业务优化之从分布式锁到基于消息队列的异步秒杀

一、业务场景介绍 优惠券、门票等限时抢购常常出现在各类应用中&#xff0c;这样的业务一般为了引流宣传而降低利润&#xff0c;所以一旦出现问题将造成较大损失&#xff0c;那么在业务中就要求我们对这类型商品严格限时、限量、每位用户限一次、准确无误的创建订单&#xff0c…