React如何实现Vue的keepAlive功能
前言
在React中,默认情况下组件在被卸载后会销毁状态,这与Vue的keep-alive功能不同。在Vue中,keep-alive组件可以缓存组件状态,在路由切换时重新挂载。实现这一功能在React中并不简单,但我们可以借助一个第三方库——react-activation 来模拟Vue的keep-alive功能。
react-activation简介
可以看看github介绍:react-activation
react-activation 是一个用于React的状态保持库,可以缓存组件的状态和DOM,适用于多页面应用的路由缓存等场景。它的核心功能包括:
- 缓存组件:在不卸载组件的情况下保存其状态和DOM。
- 恢复组件:当组件重新激活时,可以保留之前的状态和DOM,而无需重新渲染。
- 缓存控制:可以通过配置选项控制哪些组件需要缓存,哪些不需要。
react-activation安装
yarn add react-activation
# 或者
npm install react-activation
兼容性
-
React v16 / v17 / v18
-
Preact v10+
-
兼容 SSR
注意!!!
- 不要使用 <React.StrictMode /> 严格模式
- (React v18+) 不要使用 ReactDOMClient.createRoot, 而是使用 ReactDOM.render
项目里代码实现
入口文件main.tsx
在不会被销毁的位置放置 外层,一般为应用入口处
import { render } from 'react-dom';
import { AliveScope } from 'react-activation';
render(<AliveScope><Router><App /></Router></AliveScope>,document.getElementById('root')
);
路由文件 router.tsx
export const routes = [{path: '/',element: <Home />,keepAlive: true},{path: '/home',element: <Home />,keepAlive: true},{path: '/xxx',element: <Index2 />},
]
App.tsx文件
这里可以根据router.tsx的配置看是否需要缓存, 引入KeepAlive组件,设置cacheKey来避免冲突
function App() {
const location = useLocation();
const route = useRoutes(routes.map(item => ({...item,element: item.keepAlive ? (<KeepAlive cacheKey={item.path}>{item.element}</KeepAlive>) : (item.element)})));// 这里根据是否为首页设置z-50是因为在首页有多个Popup,缓存了首页后点击Popup的里面内容跳转别的页面,这个Popup因为层级很高,并且和root是同级节点所以会一直存在,所以给这些Popup也要设置层级z-10,这样在跳转至别的页面时,这些Popup的层级10没有50高就不会出现
return (<divclassName={`w-full h-screen flex justify-center bg-primary relative ${location.pathname === '/home' || location.pathname === '/'? '': 'z-50'}`}><div className="w-[393px] h-screen">{route}</div></div>)
}
总结
react-activation 是一个非常实用的库,能够帮助我们在React中实现类似于Vue keep-alive的缓存功能。在单页面应用中,合理地使用KeepAlive来缓存组件,可以显著提升用户体验,减少重复渲染带来的性能消耗。 引入KeepAlive组件,设置cacheKey来避免冲突,是最重要的!
相关文章:
React如何实现Vue的keepAlive功能
前言 在React中,默认情况下组件在被卸载后会销毁状态,这与Vue的keep-alive功能不同。在Vue中,keep-alive组件可以缓存组件状态,在路由切换时重新挂载。实现这一功能在React中并不简单,但我们可以借助一个第三方库——…...
在 Ubuntu 22.04 LTS 上安装 NVM (Node Version Manager) 管理和切换不同版本的 Node.js npm
安装 nvm curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash# nvm --version 0.40.1安装 Node.js 的不同版本 列出所有可用的 Node.js 远程版本 nvm ls-remotenvm install v18.20.4# node --version v18.20.4# nvm current v18.20.4npm 是 …...
如何搭建题库管理小序❓
土著刷题小🍊序不仅能够作为组织考试的利器,它同样可以帮助教育培训机构构建一个强大且高效的题库管理系统。 下面跟随我们的指导,一起来看看如何利用土著刷题小🍊序轻松快捷地建立起自己的题库,并享受其所带来的诸多好…...
Spring Boot框架下校园社团信息管理的创新实践
2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统,它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等,非常…...
vscode clangd for cuda 插件配置
这里写目录标题 1. 下载插件clangd,并且安装server到host2. 配置3. 安装调试插件 1. 下载插件clangd,并且安装server到host 步骤 extension下载 altshiftp, 下服务,如果下不下来请考虑用🪜 下载好后check一下,检查是否正常 正常的标志 注意…...
软件测试学习笔记丨SeleniumPO模式
本文转自测试人社区,原文链接:https://ceshiren.com/t/topic/22525 本文为霍格沃兹测试开发学社的学习经历分享,写出来分享给大家,希望有志同道合的小伙伴可以一起交流技术,一起进步~ 说明:本篇博客基于sel…...
研发效能DevOps: Vite 使用 Vue Router
目录 一、实验 1.环境 2.初始化前端项目 3.安装vue-router 4.Vite 使用 Vue Router 二、问题 1.运行出现空页面 2.Vue Router如何禁止页面回退 一、实验 1.环境 (1)主机 表1 主机 系统 软件版本备注Windows11VS Code1.94.2Node.jsv18.20.4(LT…...
记第一次本地编译seatunnel源码
拉取代码 git clone https://github.com/apache/seatunnel.git 使用版本 我们生产环境用的是2.3.5版本,所以基于2.3.5-release分支代码进行编译。 maven package过程 遇到的第一个问题:‘com.sun.tools.javac.tree.JCTree com.sun.tools.javac.tree…...
《云主机配置全攻略》
《云主机配置全攻略》 一、云主机配置的重要性二、配置云主机的关键要素(一)CPU 的选择(二)内存的考量(三)硬盘的抉择(四)带宽的确定(五)机房线路的考虑&…...
RHCE nginx架构和安装
nginx架构和安装 nginx架构和安装1.1 nginx架构1.2 安装nginx1.1.1 本地安装1.1.2 官网安装1.1.3 源码安装 1.3 控制服务1.4 页面自定义 nginx架构和安装 nginx是多进程组织模式,而且是一个由 Master 主进程和 Worker 工作进程组成 1.1 nginx架构 1.2 安装nginx …...
Jmeter自动化实战
一、前言 由于系统业务流程很复杂,在不同的阶段需要不同的数据,且数据无法重复使用,每次造新的数据特别繁琐,故想着能不能使用jmeter一键造数据 二、创建录制模板 可参考:jmeter录制接口 首先创建一个录制模板 因为会有各种请求头,cookies,签名,认证信息等原因,导致手动复制…...
构建高效的Java SOCKS5代理:从零开始的网络转发实现
✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…...
spring-boot(绑定配置文件及应用)
配置文件 SpringBoot使用一个全局的配置文件,配置文件名是固定的; application.properties application.yml 配置文件的作用:修改SpringBoot自动配置的默认值;SpringBoot在底层都给我们自动配置好; YAML&#x…...
Mac OS 搭建MySQL开发环境
Mac OS 搭建MySQL开发环境 文章目录 Mac OS 搭建MySQL开发环境一、安装Mysql:二、配置环境变量三、安装Navicat 本地环境: Mac OS Sequoia15.0.1(M3 Max) 目标状态: 下载安装Mysql,配置相关环境。 一、安装Mysql&…...
windows下安装python库wordCloud报错
换电脑安装wordcloud半天安装失败,记录一下遇到的坑,也给大家节省点时间。 方法1: 错误呢就是下面这个,说没c编译器,要不就去他给的地址上安装一下,我安装了一下好像没什么用,也没太敢勾选&am…...
Spring IOC 自动装配(注入)
注解⽅式注⼊ Bean 对于 bean 的注⼊,除了使⽤ xml 配置以外,可以使⽤注解配置。注解的配置,可以简化配置⽂件, 提⾼开发的速度,使程序看上去更简洁。对于注解的解释,Spring对于注解有专⻔的解释器&#…...
Go使用SIMD指令——以string转为整数为例
本文Go使用SIMD指令采用如下方式: C编写对应的程序clang编译成汇编c2goasm将上述生成的汇编转为go的汇编 准备工具 clang。直接使用apt-get install clang安装即可c2goasm。 go get -u github.com/minio/c2goasm来进行安装asm2plan9s。 go get -u github.com/min…...
分享资源合集
为了方便临时使用到的一些软件,提供百度网盘下载。 通过百度网盘分享的文件:WinHex 21.2 SR-2_x86_x64.exe 链接:https://pan.baidu.com/s/19RAnHl_VcKUcIKADU9z9Gw?pwd6666 提取码:6666 通过百度网盘分享的文件:Zi…...
C#/WinForm 鼠标穿透自定义区域截图(后续实现录屏)
效果 窗体截图录屏 git地址:https://gitee.com/feng-cai/screenshot-recording...
基于SpringBoot的“社区维修平台”的设计与实现(源码+数据库+文档+PPT)
基于SpringBoot的“社区维修平台”的设计与实现(源码数据库文档PPT) 开发语言:Java 数据库:MySQL 技术:SpringBoot 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 管理员登录页面 住户管理页面 社区公关管理页面 维…...
OpenClaw密码管理:nanobot安全存储与自动填充方案
OpenClaw密码管理:nanobot安全存储与自动填充方案 1. 为什么需要本地化的密码管理方案 去年的一次数据泄露事件让我彻底放弃了所有云端密码管理器。当时我使用的某知名商业工具突然弹出安全警报,提示"您的部分密码可能已被未授权访问"。虽然…...
SVPWM/AZSPWM的simulink仿真 AZSPWM(Advanced Zero Se...
SVPWM/AZSPWM的simulink仿真 AZSPWM(Advanced Zero Sequence Pulse Width Modulation,先进零序脉宽调制)是一种改进的脉宽调制技术,主要应用于三相逆变器中,通过引入零序分量来优化输出电压的波形和性能。 AZSPWM的目标…...
【高通Camera_Tuning】优化树荫下及背景绿植时白平衡偏色问题(一)
参考案例:在室外拍摄时白平衡正常,但遇到树荫下或背景有绿植时出现偏色(偏蓝)问题。可通过修改绿区解决偏色问题。解决方法:1.开启Green zone在3A文件 -- /* Green */ -- /* Green Projection Enable */将/* Green Pr…...
2026年3月27日NSSCTF之[SWPUCTF 2021 新生赛]ez_unserialize
[SWPUCTF 2021 新生赛]ez_unserialize 开启环境,进入并查看,可以看到一个动图,选择查看网页源码,得到 看到有隐藏信息,根据隐藏信息可以猜测,可以利用robots协议查看相关信息,访问得到 可以得…...
一本计算机专业,准大一,有什么忠告?
你现在大概处于一种很特别的状态。高考刚结束不久,录取通知书拿到了,专业是计算机。可能是你自己选的,也可能是家里建议的,也可能是分数刚好够就填了。不管哪种,你现在对”计算机专业到底学什么”的理解大概率是模糊的…...
ES920 Arduino库深度解析:Sub-1GHz工业无线通信实战指南
1. ES920无线模块Arduino库深度解析:面向工业级Sub-1GHz通信的工程实践指南ES920系列是日本Echostar公司推出的高性能Sub-1GHz无线通信模块,涵盖FSK调制的ES920与LoRa调制的ES920LR两个子型号。该系列模块专为日本920MHz ISM频段(920.6–928.…...
IPD实战指南:CBB模块化设计如何加速产品创新与资源整合
1. CBB模块化设计的本质与价值 第一次接触CBB这个概念时,我正负责一款智能家居产品的研发。当时团队为了赶进度,每个新产品都从零开始设计电路板,结果发现80%的功能模块都是重复的。这种低效的开发方式让我开始思考:能不能像搭积木…...
Spring Boot实战:5分钟搞定CORS跨域配置(含@CrossOrigin详解)
Spring Boot实战:5分钟搞定CORS跨域配置(含CrossOrigin详解) 现代Web开发中,前后端分离架构已成为主流选择。这种架构下,前端应用运行在一个域名下,而后端API服务则部署在另一个域名。当浏览器尝试从前端向…...
省流量秘籍:ESP32+LittleFS构建超轻量级物联网WEB界面(附低功耗配置)
ESP32物联网低功耗WEB界面开发实战:从LittleFS优化到移动端适配 在野外环境或移动场景中部署物联网设备时,每毫安的电流消耗和每KB的流量都值得精打细算。ESP32作为一款高性价比的Wi-Fi/蓝牙双模芯片,其灵活的网络配置和丰富的外设接口使其成…...
Modelsim仿真Objects窗口一片空白?别急着重装,试试这个被忽略的优化选项设置
Modelsim仿真Objects窗口空白问题深度排查指南 当你在Modelsim中精心搭建的仿真环境突然"失明"——Objects窗口一片空白,而代码明明编译通过时,这种看似无解的困境往往让工程师陷入重装软件的冲动。但请先别急着点击卸载按钮,这很可…...
