发布时间:2026/9/5 21:44:56
ReactHook - useEffect、useLayoutEffect useEffect作用推迟代码执行渲染完成之后再执行常用于 数据读取完成移除 - 组件卸载的时候做一些清理的工作例如移除定时器、事件监听器等有关组件卸载触发时机当组件从 DOM 中移除时会触发useEffect里返回的函数useEffect里的内容不会执行执行也没有意义了。当组件出现在DOM中时会执行useEffect里的代码useEffect里返回的函数不执行。importReact,{useState,useEffect}fromreact;functionTimerComponent(){const[count,setCount]useState(0);useEffect((){consttimersetInterval((){setCount(prevCountprevCount1);},1000);// 返回的函数将在组件卸载时执行return(){clearInterval(timer);console.log(Timer cleared);};},[]);// 空依赖数组effect 只在挂载和卸载时运行returndivTimer:{count}/div;}exportdefaultTimerComponent;该行为是模拟了componentWillUnmount常用于清理操作例如取消网络请求、清除计时器或移除事件监听器。补充何时执行componentWillUnmount组件从页面移除当用户导航到另一个页面或条件渲染使得组件不再显示时componentWillUnmount 会被调用。在上面的例子中当 TimerComponent 被移除时计时器会被清除。父组件卸载如果父组件卸载了所有子组件也会卸载它们的 componentWillUnmount 也会被调用。第二个参数来模拟生命周期。对于缓存的对象来说因为每次函数都重新执行因此对象的引用会变所以useEffect第二个参数缓存的是引用的地址。useEffect存在一种bail out(保释) / (补救)机制当你尝试设置相同的状态仅仅让你把函数执行完但不会再触发effect。同理在class组件中的setState也是一样。setStatestate设置重复的值 —— 只会重复渲染一次 11. 推迟代码执行例如上面其实本来就是一种错误的写法只是React官方帮你兜了个底。正确的做法是2. 完成移除 定时器、监听functionHOC(){const[count,setCount]useState(0);useEffect((){console.log(创建)return(){console.log(销毁)}});return(button onClick{()setCount(count1)}按钮/button/)}exportdefaultHOC;当状态变化的时候重新渲染重新渲染导致useEffect执行前提是没有依赖项。在第一次刷新的时候不执行useEffect返回的函数只执行useEffect里的内容。后面状态变化导致重新渲染的时候会优先执行useEffect返回的函数然后再执行useEffect里的内容。例如页面初始化时第一次点击按钮时useEffect - clean-up阶段有两个删除组件重新渲染当前组件1. 第一个删除组件的时候执行注意useEffect里的回调如果有返回值的话必须是一个函数。会先执行这个return函数例如下面的代码。2. 第二个重新渲染的时候执行开发环境StrictMode下useEffect跑两遍在开发环境中React 可能会让组件经历类似下面的流程第一次挂载 mount - 执行 useEffect 立刻模拟卸载 unmount - 执行 useEffect 的 cleanup 清理函数 再次挂载 mount - 再执行 useEffect所以你会看到useEffect(() { console.log(effect run); return () { console.log(cleanup); }; }, []);开发模式下可能打印effect run cleanup effect run但这不是 bug也不是生产环境行为。这是 React 在开发环境下故意做的检查。注意错误的使用state会导致资源泄露例如1.某种异步操作开始——非常长2.组件已经被卸载了3.setState - 资源(内存泄露、socket泄露主要是内存泄露)泄露代码如下会报如下警告⚠️Warning: Can’t perform a React state update on an unmounted component. This is a no-op, but it indicates a memory leak in your application. To fix, cancel all subscriptions and asynchronous tasks in a useEffect cleanup function.in Unknown (at App.js:13)解决方法3. 第三种 第二个参数来模拟生命周期。useEffect选择执行当a变化才打印effect a当b变化才打印effect b类似于[a]这种形式 官方叫做 ”跳过“useEffect模拟生存周期函数useEffect(fn, [值]);如componentDidMountuseEffect() 的callback返回函数的case其实是根据当前操作来的是添加移除定时器还是添加移除dom执行效果是不一样的具体可以参考useEffect() 有始有终useLayoutEffect是 React 提供的一个 Hook你可以把它理解为**“在浏览器把画面绘制出来之前React 给你的最后一次修改 DOM 的机会”**。它的功能签名和useEffect几乎一模一样但核心区别在于执行时机。useEffect vs useLayoutEffect为了理解它我们需要看浏览器的渲染流程React 更新 DOM→useLayoutEffect 执行→浏览器绘制 (Paint)→useEffect 执行特性useEffect (常用)useLayoutEffect (特殊)执行时机浏览器绘制完成后异步执行浏览器绘制之前同步执行视觉体验如果修改了布局用户可能会看到闪烁先显示旧位置再跳到新位置用户看不到中间状态直接看到最终结果无闪烁性能影响不阻塞浏览器绘制性能较好会阻塞浏览器绘制用多了会导致页面卡顿比喻演出开始后你在后台改道具幕布拉开前你冲上去把道具摆好 什么时候必须用 useLayoutEffect只有当你需要读取 DOM 布局如宽高、位置并立即同步修改 DOM时才使用它。主要用于解决“视觉闪烁”问题。典型场景 1防止弹窗/气泡定位闪烁假设你要做一个 Tooltip气泡提示它需要显示在按钮的上方。如果用useEffect页面先渲染 Tooltip 在默认位置比如左上角 - 浏览器绘制 -useEffect计算按钮位置 - 修改 Tooltip 位置 - 用户看到 Tooltip“闪”了一下跳到了按钮上方。如果用useLayoutEffectReact 更新 DOM -useLayoutEffect立即计算位置并修改 - 浏览器绘制直接画出正确位置的 Tooltip - 用户完全感觉不到位置修正的过程。典型场景 2根据内容调整布局比如你需要根据一个容器的实际宽度来决定里面放几个卡片。你需要先测量容器宽度再决定渲染逻辑这个过程必须在绘制前完成。典型场景 3强制同步滚动比如进入聊天室你希望滚动条直接到底部不想让用户看到“先在顶部再跳到底部”的过程。⚠️ 什么时候不要用绝大多数情况下请优先使用useEffect。以下场景不要用useLayoutEffect数据请求 (API 调用)事件订阅/监听日志记录、埋点写入 LocalStorage任何不依赖 DOM 测量的操作因为在这些场景下使用useLayoutEffect只会徒增性能开销阻塞页面渲染带来卡顿风险。 总结口诀“涉及测量和布局修正怕闪就用useLayoutEffect其他所有副作用统统用useEffect。”useLayoutEffect是 React16.8.0版本引入的。

相关新闻

2026/9/6 7:16:55

LPrint终极指南:5分钟搞定全平台标签打印的完整解决方案

LPrint终极指南:5分钟搞定全平台标签打印的完整解决方案 【免费下载链接】lprint A Label Printer Application 项目地址: https://gitcode.com/gh_mirrors/lp/lprint 在数字化办公和物流管理中,标签打印需求无处不在,但跨平台兼容性问…

2026/9/6 4:23:03

Nemotron-CLIMB代理模型实战教程:从下载到推理的完整流程

Nemotron-CLIMB代理模型实战教程:从下载到推理的完整流程 【免费下载链接】nemotron-climb-proxy-models 项目地址: https://ai.gitcode.com/hf_mirrors/nvidia/nemotron-climb-proxy-models Nemotron-CLIMB代理模型是由NVIDIA开发的轻量级语言模型&#xf…

2026/9/6 11:57:36

昆明断桥平开窗隔音效果

昆明气候温和但昼夜温差大,加上不少主城区临街住宅噪音问题突出,断桥平开窗成了本地家装改造的热门选择。我有个住在人民中路的朋友,白天车流声就没断过,换了窗之后才敢开窗透气。本地门窗行业报告也显示,超过六成家装…

2026/9/6 11:57:36

MLP模型优化实战:如何为关键层提供更多关注提升性能

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/6 11:57:36

维普AIGC检测有新变动?2026年3天实测降AIGC策略与3款幸存工具

维普官方刚发布了一则重磅通知!2026年2月5日,个人AIGC检测服务完成了全面升级! 不少同学还没反应过来,拿着之前准备好的稿子去检测,直接傻了眼——明明内容没改动,AI率却飙升得离谱,找导师询问…

2026/9/6 11:57:36

标题:3岁以上换季就犯鼻炎的儿童可以吃牛初乳吗

正文: 入春之后带娃去城郊的樱花园走了一圈,回家没两个小时他就开始不停揉眼睛,连着打了七八个喷嚏,清水鼻涕擦得鼻子下面都红了。之前也带他去儿科看过,说是换季过敏性鼻炎,开的喷鼻剂和抗过敏的药&#x…

2026/9/6 11:57:36

如何快速上手陌生开源项目:从定位到测试的完整指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/6 11:52:36

Voice Agent实战:从STT-Agent-TTS架构到多模态语音智能体工程落地

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/6 0:06:59

超人会飞不算本事:系统稳定依赖清晰规则与边界设计

开头先不绕弯子。“#斯坦李吐槽dc 所以超人是无缘无故会飞的嘛哈哈哈哈哈哈哈锤哥真是技术人才啊!#雷神 #复联”这类调侃式短标题,第一波冲击力在于它把两个宇宙的角色塞进同一个吐槽箱里,但细想一下就能发现,它真正碰到的根本不是…

2026/9/6 0:06:59

超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论

把“蜘蛛侠 vs 超人”放在 CSDN 上聊,可能很多人第一反应是走错片场了。但如果把这两个角色看成“两个持续运营了 80 多年的文化产品”,你会发现,这场比较本质上是两个不同 IP 策略的长期结果对比:超人赢在定义了整个超级英雄题材…

2026/9/6 0:06:59

基于CNN的调制信号识别:MATLAB实现时频图分类实战

简介:本资源是一套面向通信工程与信号处理方向学习者、研究者的深度学习实践方案,聚焦调制信号自动检测与识别这一典型无线通信任务,解决传统方法依赖人工特征、低信噪比下性能下降等痛点。压缩包共12个文件(10.73MB)&…

2026/9/6 0:06:59

超人会飞不算本事:系统稳定依赖清晰规则与边界设计

开头先不绕弯子。“#斯坦李吐槽dc 所以超人是无缘无故会飞的嘛哈哈哈哈哈哈哈锤哥真是技术人才啊!#雷神 #复联”这类调侃式短标题,第一波冲击力在于它把两个宇宙的角色塞进同一个吐槽箱里,但细想一下就能发现,它真正碰到的根本不是…

2026/9/6 0:06:59

超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论

把“蜘蛛侠 vs 超人”放在 CSDN 上聊,可能很多人第一反应是走错片场了。但如果把这两个角色看成“两个持续运营了 80 多年的文化产品”,你会发现,这场比较本质上是两个不同 IP 策略的长期结果对比:超人赢在定义了整个超级英雄题材…

2026/9/6 0:06:59

基于CNN的调制信号识别:MATLAB实现时频图分类实战

简介:本资源是一套面向通信工程与信号处理方向学习者、研究者的深度学习实践方案,聚焦调制信号自动检测与识别这一典型无线通信任务,解决传统方法依赖人工特征、低信噪比下性能下降等痛点。压缩包共12个文件(10.73MB)&…

2026/9/6 11:40:10

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/5 2:30:42

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/6 10:19:40

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…