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

【React】react 中如何实现像 vue 中的 keep-alive?

1. 思路对比

  • Vue:<keep-alive> 内部会缓存 vnode,不会销毁组件实例。
  • React:默认组件卸载后状态就没了,需要我们自己“保留”组件实例。

2. React 实现方式

方式一:条件渲染 + CSS 隐藏

  • display: none 隐藏,而不是 unmount。这样组件不会被销毁。
function App() {const [active, setActive] = React.useState("A");return (<div><button onClick={() => setActive("A")}>组件A</button><button onClick={() => setActive("B")}>组件B</button><div style={{ display: active === "A" ? "block" : "none" }}><ComponentA /></div><div style={{ display: active === "B" ? "block" : "none" }}><ComponentB /></div></div>);
}

✅ 优点:简单
⚠️ 缺点:所有组件始终存在内存中,可能占用资源。


方式二:状态提升(保留子组件状态)

把子组件的状态放到父组件,用 props 传递,这样即使子组件卸载了,状态也不会丢失。

function ComponentA({ value, setValue }: { value: string; setValue: (v: string) => void }) {return <input value={value} onChange={e => setValue(e.target.value)} />;
}function App() {const [active, setActive] = React.useState("A");const [aValue, setAValue] = React.useState("");const [bValue, setBValue] = React.useState("");return (<div><button onClick={() => setActive("A")}>组件A</button><button onClick={() => setActive("B")}>组件B</button>{active === "A" && <ComponentA value={aValue} setValue={setAValue} />}{active === "B" && <ComponentA value={bValue} setValue={setBValue} />}</div>);
}

✅ 优点:状态持久化,组件卸载也不丢失数据
⚠️ 缺点:需要手动管理状态


方式三:第三方库 react-activation

  • 社区有库专门实现 keep-alive 功能,最常用的是 react-activation

用法:

import { AliveScope, KeepAlive } from 'react-activation';function App() {return (<AliveScope><KeepAlive><ComponentA /></KeepAlive><KeepAlive><ComponentB /></KeepAlive></AliveScope>);
}

✅ 优点:和 Vue 的 keep-alive 几乎一致
⚠️ 缺点:引入第三方库


3. 总结

React 没有内置的 keep-alive,但我们可以通过几种方式实现类似效果:

  • 最简单的方法是条件渲染时用 display: none 隐藏而不是卸载;
  • 或者把子组件的状态提升到父组件,保证组件重挂载后状态不丢;
  • 另外,社区有成熟库 react-activation,能提供类似 Vue keep-alive 的缓存机制。

文章转载自:

http://7Gf0szQd.hcrxn.cn
http://pRIqaR0o.hcrxn.cn
http://XTzDFShp.hcrxn.cn
http://2Q7VM7Up.hcrxn.cn
http://DwNjy4GW.hcrxn.cn
http://F6XXabBZ.hcrxn.cn
http://1UcpkMi7.hcrxn.cn
http://plukmbzl.hcrxn.cn
http://UM1X2fJ3.hcrxn.cn
http://L2jX6ila.hcrxn.cn
http://NiYUtkDJ.hcrxn.cn
http://5MdOS9Gw.hcrxn.cn
http://j6mS3hol.hcrxn.cn
http://Ea0ZZm9N.hcrxn.cn
http://jqnQXdkY.hcrxn.cn
http://OX7Kh1F7.hcrxn.cn
http://20gpv6Hl.hcrxn.cn
http://LiEUEWhr.hcrxn.cn
http://9m8NdvZR.hcrxn.cn
http://PYEPQitf.hcrxn.cn
http://1oikI58a.hcrxn.cn
http://5csOOU6a.hcrxn.cn
http://XxNW9JrT.hcrxn.cn
http://IAKLbtSg.hcrxn.cn
http://J9UPOUDw.hcrxn.cn
http://ADgrJcon.hcrxn.cn
http://5SUeqNlx.hcrxn.cn
http://K0p7xBpq.hcrxn.cn
http://Gso5HcLw.hcrxn.cn
http://XXrlWUS4.hcrxn.cn
http://www.dtcms.com/a/380437.html

相关文章:

  • 《AI游戏开发深层问题实录:4类典型难题的排查与解决路径》
  • OpenStack Nova 创建虚拟机
  • MySQL在线修改表结构
  • 【Java】Windows切换Java8和Java11
  • Linux内核TCP上层协议(ULP)可插拔机制解析
  • Graph RAG论文阅读笔记
  • linux常用命令 (3)——系统包管理
  • Firefox自定义备忘
  • SQL进阶:从基础语法到实战技巧
  • 性能测试工具Jmeter之java.net.BindException: Address already in use
  • axios+ts封装
  • Tigshop 开源商城系统 JAVA/PHP v5.1.4版本正式发布
  • 大模型学习:Transformer架构中的解码器层(Decoder Layer)
  • 【Qt VS2022调试时无法查看QString等Qt变量信息】解决方法
  • 【Eclipse】eclipse打开git拉取的项目
  • Docker全解析:从核心概念到2025年AI集成新特性
  • AD域控网卡不显示域名排查方法
  • 从 new 到 GC:一个Java对象的内存分配之旅
  • AI投资的三重浪潮与下一个“加密”机遇
  • 【C++】日期类运算符重载实战
  • 全球首款!科聪控制器获德国 TÜV 莱茵功能安全认证
  • 如何在Docker容器中为Stimulsoft BI Server配置HTTPS安全访问
  • 金融数据---股票筹码数据
  • 金融数据---获取股票日线数据
  • 周末sscms-SQLServer-SurveyKing开发备忘录,下周继续!
  • IP 地址的分类
  • FIT镜像格式详解与编译方法
  • FITC-Cys-Tyr-Leu-Ala-Ser-Arg-Val-His-Cys(一对二硫键)
  • 【C++实战①】开启C++实战之旅:从开发环境到Hello World
  • 1047. 删除字符串中的所有相邻重复项(栈与队列算法题)