useLayoutEffect与useEffect区别

useLayoutEffect与useEffect都是在render后执行,并且先同步执行useLayoutEffect,后异步执行useEffect

重点:在render的内容呈现在用户眼睛前会同步执行useLayoutEffect,所以useLayoutEffect里设置的state才是用户直接会看到的实际内容(无视render里state的默认值)

useLayoutEffect中,可以获得准确的dom更新后的诸如clientHeight,offsetHeight值

视频讲解

React中的useEffect和useLayoutEffect 你真的搞懂了吗,这是个经典的面试题_哔哩哔哩_bilibili

### useEffectuseLayoutEffect的执行顺序 在React中,`useEffect` `useLayoutEffect` 的主要区别在于它们何时触发以及如何处理副作用。对于 `useEffect` 而言,在浏览器完成布局绘制之后才会调用它所定义的效果函数[^1];而对于 `useLayoutEffect` 来说,则是在所有的DOM变更发生后但在浏览器执行绘制前同步调用效果函数。 具体来说: - 当组件首次渲染或状态发生变化时,先会更新DOM。 - 接着,如果存在 `useLayoutEffect` ,那么这些钩子会在浏览器即将刷新屏幕之前立即被激活并运行其内部逻辑。 - 浏览器接着准备进行下一次重绘流程。 - 最终,任何由 `useEffect` 定义的操作将在当前帧结束后的下一个微任务间隙被执行。 因此可以得出结论:当涉及到同一级别的生命周期事件时(即初次加载或是后续的状态变化),`useLayoutEffect` 总是早于 `useEffect` 执行。 为了更直观地展示这一点,下面是一个简单的例子来比较两者的执行时间点差异: ```javascript import React, { useState, useEffect, useLayoutEffect } from 'react'; function Example() { const [count, setCount] = useState(0); console.log('Rendering...'); useLayoutEffect(() => { console.log('useLayoutEffect runs'); }, [count]); useEffect(() => { console.log('useEffect runs'); }, [count]); return ( <div> <p>You clicked {count} times</p> <button onClick={() => setCount(count + 1)}> Click me </button> </div> ); } ``` 在这个案例里,每当点击按钮改变计数器数值的时候,“Rendering…” 将最先打印出来表示正在重新渲染组件;紧接着你会看到 "useLayoutEffect runs" 出现在控制台日志上,表明此时已经完成了所有必要的DOM变动但是还没有开始新的画面绘制过程;最后才是 "useEffect runs", 表明该阶段已处于两个连续的画面之间的一个短暂休息期。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值