Skip to content

useEffect 与 useLayoutEffect ​

2022-12-28 23:41:02

useEffect ​

  • 对于 useEffect 执行, React 处理逻辑是采用异步调用 ,对于每一个 effect 的 callback, React 会向 setTimeout 回调函数一样,放入任务队列,等到主线程任务完成,DOM 更新,js 执行完成,视图绘制完毕,才执行。所以 effect 回调函数不会阻塞浏览器绘制视图。

useLayoutEffect ​

  • useLayoutEffect 和 useEffect 不同的地方是采用了同步执行

  • useLayoutEffect 是在 DOM 更新之后、浏览器绘制之前执行,这样可以方便修改 DOM,获取 DOM 信息,这样浏览器只会绘制一次,如果修改 DOM 布局放在 useEffect,那 useEffect 执行是在浏览器绘制视图之后,接下来又改 DOM,就可能会导致浏览器再次回流和重绘。而且由于两次绘制,视图上可能会造成闪现突兀的效果

  • useLayoutEffect callback 中代码执行会阻塞浏览器绘制

结论 ​

修改 DOM,改变布局就用 useLayoutEffect,其他情况就用 useEffect

Released under the MIT License.