在 Vue 3 中,如何缓存和复用动态组件

在 Vue 3 中,如何缓存和复用动态组件,这有助于提高应用的性能,避免组件重复创建和销毁带来的开销。下面详细介绍其使用方法和相关配置。

1. 使用 <KeepAlive> 组件缓存动态组件

基本使用

<KeepAlive> 是 Vue 3 内置的一个组件,它可以将包裹在其中的动态组件进行缓存,当组件被切换隐藏时,其状态会被保留,再次显示时无需重新创建。

<template><div><button @click="currentComponent = 'ComponentA'">显示组件 A</button><button @click="currentComponent = 'ComponentB'">显示组件 B</button><!-- 使用 KeepAlive 包裹动态组件 --><KeepAlive><component :is="currentComponent" /></KeepAlive></div>
</template><script setup>
import { ref } from 'vue';
import ComponentA from './ComponentA.vue';
import ComponentB from './ComponentB.vue';const currentComponent = ref('ComponentA');const components = {ComponentA,ComponentB
};
</script>
代码解释
  • 在模板中,使用 <KeepAlive> 组件包裹 <component :is="currentComponent" />,这样 ComponentAComponentB 在切换时会被缓存。
  • currentComponent 是一个响应式变量,用于控制显示哪个组件。

包含和排除特定组件

你可以使用 includeexclude 属性来指定哪些组件需要被缓存或排除。这两个属性的值可以是组件名称的字符串、正则表达式或数组。

<template><div><button @click="currentComponent = 'ComponentA'">显示组件 A</button><button @click="currentComponent = 'ComponentB'">显示组件 B</button><!-- 只缓存 ComponentA --><KeepAlive include="ComponentA"><component :is="currentComponent" /></KeepAlive></div>
</template><script setup>
import { ref } from 'vue';
import ComponentA from './ComponentA.vue';
import ComponentB from './ComponentB.vue';const currentComponent = ref('ComponentA');const components = {ComponentA,ComponentB
};
</script>
代码解释
  • include="ComponentA" 表示只有 ComponentA 会被缓存,ComponentB 不会被缓存,每次切换到 ComponentB 时都会重新创建。
  • 若使用 exclude 属性,则与之相反,被排除的组件不会被缓存。例如 <KeepAlive exclude="ComponentB"> 会缓存除 ComponentB 之外的组件。

最大缓存实例数

你可以使用 max 属性来限制 <KeepAlive> 缓存的最大实例数量。当缓存的实例数量超过 max 值时,最早缓存的实例会被销毁。

<template><div><button @click="currentComponent = 'ComponentA'">显示组件 A</button><button @click="currentComponent = 'ComponentB'">显示组件 B</button><button @click="currentComponent = 'ComponentC'">显示组件 C</button><!-- 最多缓存 2 个组件实例 --><KeepAlive max="2"><component :is="currentComponent" /></KeepAlive></div>
</template><script setup>
import { ref } from 'vue';
import ComponentA from './ComponentA.vue';
import ComponentB from './ComponentB.vue';
import ComponentC from './ComponentC.vue';const currentComponent = ref('ComponentA');const components = {ComponentA,ComponentB,ComponentC
};
</script>
代码解释
  • max="2" 表示 <KeepAlive> 最多缓存 2 个组件实例。当切换到第三个组件时,最早缓存的组件实例会被销毁。

组件缓存状态的生命周期钩子

当组件被 <KeepAlive> 缓存时,会有两个特殊的生命周期钩子 onActivatedonDeactivated,可以在这两个钩子中执行相应的逻辑。

<template><div>This is Component A.</div>
</template><script setup>
import { onActivated, onDeactivated } from 'vue';onActivated(() => {console.log('Component A is activated.');
});onDeactivated(() => {console.log('Component A is deactivated.');
});
</script>
代码解释
  • onActivated:当组件被激活(从缓存中显示出来)时触发。
  • onDeactivated:当组件被停用(被隐藏并放入缓存)时触发。

通过上述方法,你可以在 Vue 3 中灵活地缓存和复用动态组件,提高应用的性能和用户体验。

2. 组件实例缓存(手动管理)

除了使用 <KeepAlive>,你还可以手动管理组件实例的缓存。通过一个对象来存储组件实例,在需要使用时从对象中获取。

<template><div><button @click="showComponent('ComponentA')">显示组件 A</button><button @click="showComponent('ComponentB')">显示组件 B</button><component :is="currentComponent" v-if="currentComponent" /></div>
</template><script setup>
import { ref, shallowRef, markRaw } from 'vue';
import ComponentA from './ComponentA.vue';
import ComponentB from './ComponentB.vue';// 存储组件实例的缓存对象
const componentCache = {};
const currentComponent = ref(null);const showComponent = (name) => {if (!componentCache[name]) {const component = name === 'ComponentA' ? ComponentA : ComponentB;// 创建组件实例并存储到缓存中componentCache[name] = markRaw(shallowRef(component));}currentComponent.value = componentCache[name].value;
};
</script>
代码解释
  • componentCache 是一个对象,用于存储组件实例。
  • showComponent 方法根据传入的组件名称,检查缓存中是否存在该组件实例。如果不存在,则创建实例并存储到缓存中;如果存在,则直接从缓存中获取。

3. 组合式函数封装

可以将动态组件的逻辑封装到组合式函数中,提高代码的复用性。

// useDynamicComponent.js
import { ref, shallowRef, markRaw } from 'vue';export function useDynamicComponent() {const componentCache = {};const currentComponent = ref(null);const showComponent = (name, component) => {if (!componentCache[name]) {componentCache[name] = markRaw(shallowRef(component));}currentComponent.value = componentCache[name].value;};return {currentComponent,showComponent};
}
<template><div><button @click="showComponent('ComponentA', ComponentA)">显示组件 A</button><button @click="showComponent('ComponentB', ComponentB)">显示组件 B</button><component :is="currentComponent" v-if="currentComponent" /></div>
</template><script setup>
import { useDynamicComponent } from './useDynamicComponent.js';
import ComponentA from './ComponentA.vue';
import ComponentB from './ComponentB.vue';const { currentComponent, showComponent } = useDynamicComponent();
</script>
代码解释
  • useDynamicComponent 组合式函数封装了动态组件的缓存和显示逻辑。
  • 在组件中使用该组合式函数,通过调用 showComponent 方法来显示不同的组件。

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

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

相关文章

Nginx面试宝典【刷题系列】

文章目录 1、nginx是如何实现高并发的&#xff1f;2、Nginx如何处理HTTP请求&#xff1f;3、使用“反向代理服务器”的优点是什么?4、列举Nginx服务器的最佳用途。5、Nginx服务器上的Master和Worker进程分别是什么?6、什么是C10K问题?7、请陈述stub_status和sub_filter指令的…

excel单、双字节字符转换函数(中英文输入法符号转换)

在Excel中通常使用函数WIDECHAR和ASC来实现单、双字节字符之间的转换。其中 WIDECHAR函数将所有的字符转换为双字节&#xff0c;ASC函数将所有的字符转换为单字节 首先来解释一下单双字节的含义。单字节一般对应英文输入法的输入&#xff0c;如英文字母&#xff0c;英文输入法…

使用大语言模型(Deepseek)构建一个基于 SQL 数据的问答系统

GitHub代码仓库 架构 从高层次来看&#xff0c;这些系统的步骤如下&#xff1a; 将问题转换为SQL查询&#xff1a;模型将用户输入转换为SQL查询。 执行SQL查询&#xff1a;执行查询。 回答问题&#xff1a;模型根据查询结果响应用户输入。 样本数据 下载样本数据&#xf…

2024年国赛高教杯数学建模D题反潜航空深弹命中概率问题解题全过程文档及程序

2024年国赛高教杯数学建模 D题 反潜航空深弹命中概率问题 原题再现 应用深水炸弹&#xff08;简称深弹&#xff09;反潜&#xff0c;曾是二战时期反潜的重要手段&#xff0c;而随着现代军事技术的发展&#xff0c;鱼雷已成为现代反潜作战的主要武器。但是&#xff0c;在海峡或…

从0开始学算法-01时间复杂度、异或运算(常见面试题)、对数器的使用

一.时间复杂度 二.异或运算 3&#xff09;不用额外变量交换两个数&#xff1a; //交换a与b的值&#xff0c; 假设a甲&#xff0c;b乙 aa^b; //a甲^乙&#xff0c;b乙 ba^b; //a甲^乙&#xff0c;b甲^乙^乙甲 aa^b; //a甲^乙^甲乙&#xff0c;b甲 &#xff08;能用以上方法交换…

【亲测有效】百度Ueditor富文本编辑器添加插入视频、视频不显示、和插入视频后二次编辑视频标签不显示,显示成img标签,二次保存视频被替换问题,解决方案

【亲测有效】项目使用百度Ueditor富文本编辑器上传视频相关操作问题 1.百度Ueditor富文本编辑器添加插入视频、视频不显示 2.百度Ueditor富文本编辑器插入视频后二次编辑视频标签不显示&#xff0c;在编辑器内显示成img标签&#xff0c;二次保存视频被替换问题 问题1&#xff1…

nginx 正向代理与反向代理

1. 正向代理&#xff08;Forward Proxy&#xff09; 正向代理是指 代理客户端 访问目标服务器&#xff0c;通常用于访问受限资源或隐藏客户端 IP。 工作原理 客户端请求代理服务器&#xff08;如 nginx&#xff09;。代理服务器代表客户端向目标网站发起请求。目标网站返回内…

百度觉醒,李彦宏渴望光荣

文 | 大力财经 作者 | 魏力 2025年刚刚开年&#xff0c;被一家名为DeepSeek的初创公司强势改写。在量化交易出身的创始人梁文锋的带领下&#xff0c;这支团队以不到ChatGPT 6%的训练成本&#xff0c;成功推出了性能可与OpenAI媲美的开源大模型。 此成果一经问世&#xff0c;…

滑动验证组件-微信小程序

微信小程序-滑动验证组件&#xff0c;直接引用就可以了&#xff0c;效果如下&#xff1a; 组件参数&#xff1a; 1.enable-close&#xff1a;是否允许关闭&#xff0c;默认true 2.bind:onsuccess&#xff1a;验证后回调方法 引用方式&#xff1a; <verification wx:if&qu…

Android 实现 RTMP 推流:快速集成指南

简介 在 Android 设备上实现 RTMP 推流,可以用于直播、远程监控等应用场景。本文将基于 rtmp-rtsp-stream-client-java 库,介绍如何在 Android 端快速集成 RTMP 推流,包括权限管理、相机预览、推流控制等关键步骤。 步骤 1. 配置 Maven 仓库 在 settings.gradle.kts 中添…

2024年国赛高教杯数学建模A题板凳龙闹元宵解题全过程文档及程序

2024年国赛高教杯数学建模 A题 板凳龙闹元宵 原题再现 “板凳龙”&#xff0c;又称“盘龙”&#xff0c;是浙闽地区的传统地方民俗文化活动。人们将少则几十条&#xff0c;多则上百条的板凳首尾相连&#xff0c;形成蜿蜒曲折的板凳龙。盘龙时&#xff0c;龙头在前领头&#x…

大连本地知识库的搭建--数据收集与预处理_01

1.马蜂窝爬虫 编程语言&#xff1a;Python爬虫框架&#xff1a;Selenium&#xff08;用于浏览器自动化&#xff09;解析库&#xff1a;BeautifulSoup&#xff08;用于解析HTML&#xff09; 2.爬虫策略 目标网站&#xff1a;马蜂窝&#xff08;https://www.mafengwo.cn/&…

长文本切割实现流式调用文本合成语音

长文本切割实现TTS文本合成语音HTTP流式输出 下面是一个文本合成音频的接口文档 快速 TTS 音频构造接口文档 请求地址&#xff1a; http://52.83.113.111:13679/Say/api/ra请求方式&#xff1a; post xml raw请求参数&#xff1a; 字段名称字段作用数据格式&#xff08;示…

从零开始构建基于DeepSeek的智能客服系统

在当今的数字化时代,智能客服系统已经成为企业与客户沟通的重要桥梁。它不仅能够提升客户体验,还能大幅降低企业的运营成本。本文将带领你从零开始,使用PHP和DeepSeek技术构建一个功能强大的智能客服系统。我们将通过具体的案例和代码示例,深入探讨如何实现这一目标。 1. …

计算机网络:应用层 —— 电子邮件

文章目录 电子邮件的起源与发展电子邮件的组成电子邮件协议邮件发送和接收过程邮件发送协议SMTP协议多用途因特网邮件扩展MIME 电子邮件的信息格式 邮件读取协议邮局协议POP因特网邮件访问协议IMAP 基于万维网的电子邮件 电子邮件&#xff08;E-mail&#xff09;是因特网上最早…

CSS笔记一

一、语法 选择器{属性&#xff1a;属性值&#xff1b;属性&#xff1a;属性值} 二、书写分类 行内样式&#xff1a;直接通过style属性写在标签上 <p style"font-size80px">123456</p> 页内样式&#xff1a;在html页面创建style标签 外链样式&…

【PyTorch][chapter-33][transformer-5] MHA MQA GQA, KV-Cache

主要翻译外网&#xff1a; 解剖Deep Seek 系列&#xff0c;详细见参考部分。 目录&#xff1a; Multi-Head Attention &#xff08;MHA) KV-Cache KV-Cache 公式 Multi-Query Attention&#xff08;MQA) Grouped-Query Attention(GQA) Multi-Head Latent Attention …

Web刷题之PolarDN(中等)

1.到底给不给flag呢 代码审计 一道典型的php变量覆盖漏洞 相关知识 什么是变量覆盖漏洞 自定义的参数值替换原有变量值的情况称为变量覆盖漏洞 经常导致变量覆盖漏洞场景有&#xff1a;$$使用不当&#xff0c;extract()函数使用不当&#xff0c;parse_str()函数使用不当&…

如何看到 git 上打 tag 的时间

在 Git 中可以通过以下方法查看标签&#xff08;tag&#xff09;的创建时间&#xff1a; 使用 git show 命令&#xff1a; 运行以下命令可以查看某个特定标签的详细信息&#xff0c;包括创建时间&#xff1a; git show 输出中会包含 Tagger 的信息和 Date 字段&#xff0c;显示…

Nginx 源码编译安装

创建虚拟机&#xff0c;内存 4G 处理器 2 核&#xff0c;NAT 网络。 准备 Nginx 源码包&#xff0c;1.24 版本&#xff0c;用于实验。 一、下载 Nginx 源码包 Nginx 官网&#xff1a;www.nginx.org download 下载相关的版本&#xff0c;如下图&#xff1a; wget 下载 Nginx…