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

【前端】Vue3 中实现两个组件的动态切换保活

在 Vue3 中实现两个组件的动态切换保活,核心是通过 <component> 动态组件与 <KeepAlive> 缓存组件的组合使用。以下是具体实现方案和进阶技巧:


一、基础实现方案

1. 动态组件 + KeepAlive 保活

使用 <component :is> 实现动态切换,并用 <KeepAlive> 包裹以实现状态缓存:

<template><div><button @click="toggleComponent">切换组件</button><KeepAlive><component :is="currentComponent" /></KeepAlive></div>
</template><script setup>
import { shallowRef } from 'vue'
import CompA from './CompA.vue'
import CompB from './CompB.vue'const components = { CompA, CompB }
const currentComponent = shallowRef(CompA) // 使用 shallowRef 避免深度响应式const toggleComponent = () => {currentComponent.value = currentComponent.value === CompA ? CompB : CompA
}
</script>

关键点

  • shallowRef 替代 ref:避免对组件对象进行深度响应式转换,减少性能开销
  • KeepAlive 包裹:缓存组件实例,保留表单输入、滚动位置等状态

二、高级配置技巧

1. 精准控制缓存范围

通过 include/exclude 指定需缓存的组件名:

<KeepAlive include="CompA,CompB" max="2"><component :is="currentComponent" />
</KeepAlive>

参数说明

  • include:字符串/正则/数组,匹配组件 name 属性
  • max:最大缓存数(超过时按 LRU 算法淘汰旧实例)
2. 生命周期管理

利用专属钩子处理缓存状态:

<script setup>
import { onActivated, onDeactivated } from 'vue'onActivated(() => {console.log('组件激活:恢复定时器/网络请求')timer = setInterval(fetchData, 5000)
})onDeactivated(() => {console.log('组件休眠:清理资源')clearInterval(timer)
})
</script>

对比常规生命周期

场景常规组件被缓存组件
首次加载created → mountedcreated → mounted → activated
离开beforeUnmount → unmounteddeactivated
再次进入重新创建activated

三、常见问题解决

1. 组件未缓存
  • 原因:组件未声明 name 属性
  • 解决方案
    <!-- CompA.vue -->
    <script>
    export default { name: 'CompA' }
    </script><!-- 或使用 setup 语法糖 -->
    <script setup>
    defineOptions({ name: 'CompA' }) // 需安装 unplugin-vue-define-options 插件
    </script>
    
2. 动态切换卡顿
  • 优化方案
    • 使用异步组件加载(结合 defineAsyncComponent
    • 添加 CSS 过渡动画:
      .fade-enter-active, .fade-leave-active {transition: opacity 0.3s;
      }
      .fade-enter-from, .fade-leave-to {opacity: 0;
      }
      
3. 表单状态丢失
  • 强制刷新缓存:通过 key 属性重置组件
    <KeepAlive><component :is="currentComponent" :key="customKey" />
    </KeepAlive>
    
    切换时更新 customKey 值即可触发重新渲染。

四、性能优化建议

  1. 按需缓存:仅对高频切换或状态复杂的组件使用缓存
  2. 内存控制:设置 max 属性避免内存溢出(推荐值:3-5)
  3. 数据持久化:在 deactivated 时保存状态至 localStorage:
    onDeactivated(() => {localStorage.setItem('formData', JSON.stringify(formState))
    })
    

五、完整代码示例

<template><div class="container"><div class="switch-buttons"><button v-for="(comp, name) in components" :key="name"@click="currentComponent = comp":class="{ active: currentComponent === comp }">{{ name }}</button></div><KeepAlive :max="3"><Transition name="fade" mode="out-in"><component :is="currentComponent" /></Transition></KeepAlive></div>
</template><script setup>
import { shallowRef } from 'vue'
import CompA from './CompA.vue'
import CompB from './CompB.vue'const components = { CompA, CompB }
const currentComponent = shallowRef(CompA)
</script><style scoped>
.switch-buttons {margin-bottom: 20px;
}
button {padding: 8px 16px;margin-right: 10px;&.active {background: #1890ff;color: white;}
}
.fade-enter-active, .fade-leave-active {transition: opacity 0.3s;
}
.fade-enter-from, .fade-leave-to {opacity: 0;
}
</style>

扩展应用场景

  • 仪表盘模块切换(保留图表缩放状态)
  • 多步骤表单(缓存已填写步骤)
  • 选项卡式数据展示(保持分页器位置)

通过合理使用动态组件与 KeepAlive,可显著提升复杂交互场景下的用户体验。建议结合 Vue Devtools 观察组件缓存状态,针对性优化关键路径性能。

相关文章:

【前端】Vue3 中实现两个组件的动态切换保活

在 Vue3 中实现两个组件的动态切换保活&#xff0c;核心是通过 <component> 动态组件与 <KeepAlive> 缓存组件的组合使用。以下是具体实现方案和进阶技巧&#xff1a; 一、基础实现方案 1. 动态组件 KeepAlive 保活 使用 <component :is> 实现动态切换&am…...

拉取gitlab项目

一、下载nvm管理node 先下载配置好nvm,再用nvm下载node 下载链接&#xff1a;开始 下载nvm - nvm中文官网 情况&#xff1a;npm i 下载依赖缓慢&#xff0c;可能是node版本不对&#xff0c;可能node版本太高 可能得问题&#xff1a;使用nvm 下载低版本的node时&#xff0c;…...

树莓派(Raspberry Pi)安装Docker教程

本章教程,主要介绍如何在树莓派上安装Docker。 一、安装步骤 # 卸载旧版本(如果有): for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do sudo apt-get remove $pkg;...

计算机视觉---YOLOv4

YOLOv4&#xff08;You Only Look Once v4&#xff09;于2020年由Alexey Bochkovskiy等人提出&#xff0c;是YOLO系列的重要里程碑。它在YOLOv3的基础上整合了当时最先进的计算机视觉技术&#xff0c;实现了检测速度与精度的显著提升。以下从主干网络、颈部网络、头部检测、训练…...

在雄性小鼠自发脑网络中定位记忆巩固的因果中枢

目录 简要总结 摘要 1 引言 2 方法 3 结果 简要总结 这篇文章主要研究了雄性小鼠在自发脑网络中记忆巩固的因果中枢定位。记忆巩固涉及学习后休息和睡眠期间全脑网络的自发重组&#xff0c;但具体机制尚不清楚。目前理论认为海马体在这一过程中至关重要&#xff0c;但其他…...

刷机维修进阶教程-----没有开启usb调试 如何在锁定机型的拨号界面特殊手段来开启ADB

有时候我们会遇到一些机型被屏幕锁 账号锁等锁定。无法进入系统界面。也没有开启usb调试的情况下如何通过一些操作来开启adb调试。然后通过adb指令来禁用对应的app顺利进入系统。以此来操作保数据等操作. 通过博文了解💝💝💝 1💝💝💝----了解一些品牌机型锁定状态…...

Selenium 测试框架 - Kotlin

🚀Selenium Kotlin 实践指南:以百度搜索为例的完整测试示例 随着测试自动化的普及,Selenium 已成为 Web 自动化测试的事实标准,而 Kotlin 凭借其简洁语法和高安全性,越来越受到开发者欢迎。本指南将通过一个完整的实战案例——在百度中执行搜索操作,来展示如何使用 Sele…...

docker运行centos提示Operation not permitted

在使用Docker运行CentOS容器时&#xff0c;遇到"Operation not permitted"错误&#xff0c;通常是由于权限问题或容器安全策略引起的。以下是详细的排查和解决步骤&#xff1a; 步骤一&#xff1a;检查Docker版本和系统更新 首先&#xff0c;确保你的Docker和系统软…...

010501上传下载_反弹shell-渗透命令-基础入门-网络安全

文章目录 1 上传下载2 反弹shell命令1. 正向连接&#xff08;Forward Connection&#xff09;正向连接示例&#xff08;nc&#xff09; 2. 反向连接&#xff08;Reverse Connection&#xff09;反向连接示例&#xff08;反弹 Shell&#xff09; 对比表格实际应用中的选择防御建…...

Flask集成Selenium实现网页截图

先看效果 程序实现的功能为&#xff1a;截取目标网址对应的页面&#xff0c;并将截取后的页面图片返回到用户端&#xff0c;用户可自由保存该截图。 支持的url参数如下&#xff1a; url&#xff1a;目标网址&#xff08;必填项&#xff09;&#xff0c;字符串类型&#xff0c…...

机顶盒CM311-5s纯手机免拆刷机,全网通,当贝桌面

需要用到的工具 安卓手机一台 甲壳虫adb助手&#xff08;安卓app&#xff09; OTG转换线一个&#xff08;或者用usb&#xff0c;typec双头的U盘一个&#xff0c;未测试&#xff09; 8g U盘一个 用到的刷机文件 1.放入手机中的文件 misc recovery 2. 放入U盘根目录 upda…...

知识图谱:AI时代语义认知的底层重构逻辑

在生成式人工智能&#xff08;GEO&#xff09;的技术架构中&#xff0c;知识图谱已从辅助性工具演变为驱动机器认知的核心神经中枢。它通过结构化语义网络的重构&#xff0c;正在突破传统数据处理的线性逻辑&#xff0c;建立机器对复杂业务场景的深度理解能力。 一、语义解构&a…...

centos7安装MySQL(保姆级教学)

在 Linux 系统的软件管理中&#xff0c;YUM&#xff08;Yellowdog Updater, Modified&#xff09;包管理器是不可或缺的工具&#xff0c;而 YUM 源的选择与配置直接影响着软件安装与更新的效率。本文将深入解析网络 YUM 源的分类&#xff0c;详细介绍如何使用知名平台提供的 YU…...

2025.5.23 【ZR NOI模拟赛 T3】高速公路 题解(容斥,高维前缀和,性质)

非常牛的题&#xff0c;记录一下思路。 传送门 题意 有一张 n n n 个点的无向图&#xff0c;每个点有一个颜色 c i c_i ci​&#xff0c;满足 c i ∈ [ 1 , k ] c_i \in [1, k] ci​∈[1,k]。 图是由 m m m 条链组成&#xff0c;满足任意一个点恰好只在一条链上。对于一…...

QGIS新手教程2:线图层与多边形图层基础操作指南(点线互转、中心点提取与WKT导出)

QGIS新手教程&#xff1a;线图层与多边形图层基础操作指南&#xff08;点线互转、中心点提取与WKT导出&#xff09; 目录 QGIS新手教程&#xff1a;线图层与多边形图层基础操作指南&#xff08;点线互转、中心点提取与WKT导出&#xff09;&#x1f4cc; 引言第一部分&#xff1…...

nova14 ultra,是如何防住80°C热水和10000KPa水压冲击的?

暴雨突袭&#xff0c;手忙脚乱护住背包&#xff0c;却担心手机被雨水浸湿&#xff1b;泳池里想记录美好时刻&#xff0c;却担心手机掉入水中 &#xff1b;厨房里充满了高温水汽&#xff0c;近距离拍摄美食瞬间&#xff0c;手机屏幕花屏&#xff0c;让人失去了对美食的兴趣…… …...

Spring Boot项目中实现单点登录(SSO)完整指南

单点登录(Single Sign-On, SSO)是一种身份验证机制&#xff0c;允许用户使用一组凭证(如用户名和密码)登录多个相关但独立的系统。 一、单点登录的核心原理 SSO的核心原理使集中认证、分散授权&#xff0c;主要流程如下&#xff1a; 1.用户访问应用A 2.应用A检查本地会话&a…...

Windows环境下Redis的安装使用与报错解决

最近在做项目的时候需要用到Redis&#xff0c;本来没觉得是什么麻烦&#xff0c;下载安装使用一步到位的事&#xff0c;但紧随而来的问题&#xff0c;让我开始怀疑人生&#xff0c;再加上代码跑不出来&#xff0c;我还专门找人给我看看怎么个是&#xff0c;结果就是单纯的Redis…...

鸿蒙完整项目-仿盒马App(一)首页静态页面

跟着鸿蒙小林博主&#xff0c;练习下项目~记录下首页的搭建,后续继续完善和整体项目完成会进行布局修改&#xff0c;先按照博主的跟做&#xff0c;后续在改 1.分为底部整体框架搭建 2.首页布局&#xff08;顶部搜索、新人专享、金刚区&#xff08;两个不同集合数据&#xff09…...

大模型(4)——Agent(基于大型语言模型的智能代理)

大模型Agent是一种基于大型语言模型&#xff08;LLM&#xff09;的智能系统&#xff0c;能够自主感知环境、规划任务、调用工具并完成复杂目标。其核心原理是将大模型的推理能力与外部行动能力结合&#xff0c;实现从“思考”到“行动”的闭环。以下是其原理详解与实现方法&…...

39-居住证管理系统(小程序)

技术栈: springBootVueMysqlUni-app 功能点: 群众端 警方端 管理员端 群众端: 1.首页: 轮播图展示、公告信息列表 2.公告栏: 公告查看及评论 3.我的: 联系我们: 可在线咨询管理员问题 实时回复 居住证登记申请 回执单查看 领证信息查看 4.个人中心: 个人信息查看及修改…...

WPF【11_4】WPF实战-重构与美化(MVVM 架构)

11-9 【理论】MVVM 架构 在 WPF 项目中&#xff0c;我们主要采用的是一种类似 MVC 的架构&#xff0c;叫做 MVVM。 MVVM 继承了 MVC 的理念&#xff0c;是 Model-View-ViewModel 的缩写&#xff0c;中文意思是模型、视图、视图模型。这三个词分开看我们都能看懂&#xff0c;不…...

计算逆时针夹角(有向角度)——CAD c# 实现两条线(向量)的逆时针夹角

效果如下&#xff1a; 附部分代码如下&#xff1a; public void 逆时针夹角Demo(){// 获取当前 CAD 文档和编辑器Document doc Application.DocumentManager.MdiActiveDocument;Editor ed doc.Editor;Database db doc.Database;try{Point3d vec1Start, vec1End;if (!GetTwoP…...

鸿蒙OSUniApp 开发带有通知提示的功能组件#三方框架 #Uniapp

使用 UniApp 开发带有通知提示的功能组件 在移动应用开发中&#xff0c;通知提示&#xff08;Notification/Toast/Alert&#xff09;是提升用户体验和交互效率的重要手段。无论是表单校验、操作反馈、系统消息还是营销推送&#xff0c;合理的通知提示都能帮助用户及时获取关键…...

前端EXCEL插件智表ZCELL数据源功能详解

一、数据源功能介绍 前端EXCEL插件智表ZCELL提供了强大的数据源管理功能&#xff0c;使开发者能够灵活地在电子表格中集成和管理结构化数据。数据源功能主要分为两种类型&#xff1a; 卡片式数据源&#xff1a;适合展示和编辑单个数据记录 表格式数据源&#xff1a;适合处理表…...

打卡第31天:模块和库的导入

重复内容 知识点回顾&#xff1a; 1.导入官方库的三种手段 2.导入自定义库/模块的方式 3.导入库/模块的核心逻辑&#xff1a;找到根目录&#xff08;python解释器的目录和终端的目录不一致&#xff09; 作业&#xff1a;自己新建几个不同路径文件尝试下如何导入 导入机制的核…...

LLM Coding

AI Coding 深度解析&#xff1a;探索编程新范式与未来趋势 | w3cschool笔记https://www.phodal.com/blog/ai-friendly-architecture/bmadcode/BMAD-METHOD: Breakthrough Method for Agile Ai Driven Development...

Qt 的多线程

Qt 中的多线程主要用于处理耗时操作,避免阻塞主线程(UI 线程),从而提高程序的响应性和运行效率。以下是 Qt 多线程的相关技术总结: 常见的多线程实现方式 继承 QThread 类 :最基础的实现方式,具体步骤为继承 QThread 类,重写其 run() 函数,在 run() 函数中编写线程要…...

【请关注】各类MySQL数据备份还原分享

MySQL数据备份的全部方法 MySQL数据备份是数据库管理中的关键任务,以下是MySQL数据备份的全面方法总结: 一、逻辑备份方法 1. **mysqldump工具** - 最常用的备份工具 - 命令示例: >bash mysqldump -u [username] -p[password] [database_name] > backup.sql > -…...

Go语言方法与接收者 -《Go语言实战指南》

在 Go 中&#xff0c;方法是绑定到某个类型上的函数。与普通函数不同&#xff0c;方法具有一个“接收者&#xff08;receiver&#xff09;”&#xff0c;用于指定它是哪个类型的“方法”。 一、方法的定义语法 func (接收者名 接收者类型) 方法名(参数列表) 返回值列表 {// 方…...