您现在的位置是:亿华云 > IT科技类资讯
React要更新,就像渣男会变心
亿华云2025-10-09 12:53:01【IT科技类资讯】2人已围观
简介大家好,我是卡颂。今天和同事聊天,我说他是个铁憨憨,不会和女生聊天。他啪的一下跳起来,“我可懂情调了”“哦?那你来句土味情话。”他清清嗓子,压低了腔调,望向远方,缓缓道:如果我是component,我
大家好,新像心我是渣男卡颂。
今天和同事聊天,新像心我说他是渣男个铁憨憨,不会和女生聊天。新像心
他啪的渣男一下跳起来,“我可懂情调了”
“哦?新像心那你来句土味情话。”
他清清嗓子,渣男压低了腔调,新像心望向远方,渣男缓缓道:
如果我是新像心component,我对你的渣男情愫在didMount时燃起,直到我生命unmount时熄灭正当他沉浸在YY的新像心世界无法自拔时,我说:
你知道在React18,渣男componentDidMount和componentWillUnmount可能调用多次么?新像心从Strict Mode谈起
React有个特性 — Strict Mode,被StrictMode包裹的组件在DEV环境会对不推荐写法有更严格的提示与辅助检测行为。
<StrictMode> <div> <ComponentOne /> <ComponentTwo /> </div> </StrictMode>「辅助检测行为」是指部分方法会被React重复调用,帮助开发者更容易发现不规范使用这些方法时的潜在bug。
所有会被重复调用的API见StrictMode文档[1]
举个例子:
function App() { const [num, update] = useState(0); function onClick() { update(num + 1); } console.log(render); return ( <p onClick={ onClick}>{ num}</p> ); }当App被StrictMode包裹,点击p触发更新后,App组件会render两次。
在v17之前,例子中console.log会执行两次。亿华云计算但在v17之后,React覆写了console方法,所以console.log只会执行一次,但组件实际会render两次这么做的目的是:作为函数组件,App的「副作用」应该在useEffect回调中执行。
如果不规范书写副作用(比如在组件函数体内写副作用),那么重复render更容易暴露可能产生的bug。
铺垫完背景。接下来,让我们揭露React善变的渣男行径。
最近刷v18讨论组时突然发现:StrictMode中会增加一条Strict Effect规则。
Strict Effect
简单的说,类似上文讲到的部分API在StrictMode下会重复执行。
Strict Effect规则会让useEffect、useLayoutEffect在StrictMode下也会重复执行。
比如:
function App() { // 或useLayoutEffect useEffect(() => { // 逻辑1 return () => // 逻辑2; }, []) // ... }在当前React中,组件mount时,执行逻辑1。
而在Strict Effect规则下,mount时的逻辑如下:
组件mount时,执行逻辑1React模拟组件unmount,执行逻辑2
React模拟组件mount,执行逻辑1
注意,这里useEffect的源码库依赖项是[],在以往的认知里,依赖项为「空数组」意味着该useEffect逻辑只会在mount时执行一次。
而在v18的Strict Mode,由于包含了Strict Effect规则,mount时的useEffect逻辑会被重复执行。
某种程度上讲,这种打破开发者既有认知的Breaking Change,比Concurrent Mode更让人难以接受。
那么React团队为什么要设计这条规则呢?
一切为了Offscreen
Offscreen是一个开发中的API,预计会在某个v18的小版本发布。
他的功能类似Vue中的keep-alive,用来在组件「失活」时在后台保存组件状态。
举个Tab切换的例子,在Posts和Archive之间切换Tab:
当切换到Posts时,Archive属于「失活」状态。
如果不需要保存状态,则销毁Archive组件。当切换到Archive Tab时,再重新mount Archive。
当需要保存状态时,只能将Posts与Archive的云服务器状态保存在他们的父组件或状态管理(比如Redux)中。
而有了Offscreen API,在Fiber树(可以理解为虚拟DOM树)层面,可以保存失活的组件结构与状态。
这个API的应用场景主要包括:
切换路由时保存之前路由的状态 预加载将要切换的路由现在问题来了:当Offscreen组件从「失活」变为「活动」,会触发什么生命周期函数呢?
答案是:componentDidMount以及:
useEffect(() => { // 触发这个逻辑... }, [])当Offscreen组件从「活动」变为「失活」时,会触发componentWillUnmount与:
useEffect(() => { // ... return () => { // 触发这个逻辑... } }, [])所以,这些曾经被认为在组件生命周期中只会触发一次的方法,由于Offscreen,在未来可能会多次触发。
这也是React提前在StrictMode中加上Strict Effect规则的原因。
就像渣男变心前都会有些反常的举动。
React18是真的挑战
不管是Offscreen还是Concurrent Mode,可以预见随着v18的到来,React会更强大,相应的学习曲线会更陡峭。
这既是机遇,也是挑战。
千万别等变化一股脑到眼前时再埋怨:
你个渣男,当初说好一心一意只会触发一次,现在为了妖艳新特性,背叛我们的诺言。
到那时React只会拍拍屁股转身,留下不羁的背影:
参考资料
[1]StrictMode文档:
https://zh-hans.reactjs.org/docs/strict-mode.html#detecting-unexpected-side-effects
很赞哦!(817)
相关文章
- 为什么喜欢国外注册域名?国外注册域名注意什么?
- 实战讲解,原来用 SpringBoot 实现策略模式可以这么简单
- Spring Boot 自定义Jackson ObjectMapper,你学会了吗?
- DevOps的尽头会是NoOps吗?
- 这个不用多说,不同平台的注册价格不同,且不同平台对域名释放交易的把控与曝光不同,当然价格相对便宜且平台渠道广操作便利的平台最好。
- 消息服务:项目整合RocketMQ
- 美国大厂新员工薪资曝光! 微软最高近30万美元,TikTok低至时薪30美元
- 原来项目打包也有这么技巧 - 浅谈 Tree Shaking 机制
- 当投资者经过第二阶段的认真学习之后又充满了信心,认为自己可以在市场上叱咤风云地大干一场了。但没想到“看花容易绣花难”,由于对理论知识不会灵活运用.从而失去灵活应变的本能,就经常会出现小赢大亏的局面,结果往往仍以失败告终。这使投资者很是困惑和痛苦,不知该如何办,甚至开始怀疑这个市场是不是不适合自己。在这种情况下,有的人选择了放弃,但有的意志坚定者则决定做最后的尝试。
- 分布式编程工具Akka Streams、Kafka Streams和Spark Streaming大PK
站长推荐
3、不明先知,根据相关征兆预测可能发生的事件,以便提前做好准备,赶紧注册相关域名。;不差钱域名;buchaqian抢先注册,就是这种敏感类型。预言是最敏感的状态。其次,你应该有眼力。所谓眼力,就是善于从社会上时不时出现的各种热点事件中获取与事件相关的域名资源。眼力的前提是对域名领域的熟悉和丰富的知识。
分布式编程工具Akka Streams、Kafka Streams和Spark Streaming大PK
注意:雪花算法并不是ID的唯一选择!
大厂裁员、竞争内卷,程序员还是份好工作吗?
a、变更前的公司证件扫描件(代码证或者营业执照)及联系人身份证复印件、变更后的公司证件扫描件(代码证或者营业执照)及新的联系人身份证复印件;身份证复印件需本人签名,公司证件复印件需加盖公章。
通过这两个 Hook 回顾 Set/Map 基础知识
面试官:阻塞队列有了解过吗?
几百行代码实现一个脚本解释器