跳到主内容

React中useEffect和useLayoutEffect的区别,什么时候使用useLayoutEffect

· 3分钟阅读

React 提供了 useLayoutEffectuseEffect 两个 hook,它们在使用方式上基本没什么区别,而且大部分场景都能达到相同的效果。那么这两者的区别是什么呢?何时使用 useLayoutEffect?本文将针对两者关键的区别进行讲解。

useEffect

我们先来看看 useEffect 的使用方式,它的作用是可以模拟组件的生命周期。

模拟 componentDidMount

useEffect 模拟 componentDidMount 生命周期很简单,只需要在 useEffect 的第二个参数里面传入一个空数组 [] 即可

Live Editor
Result
Loading...

模拟 componentDidUpdate

useEffect 模拟 componentDidUpdate 也很简单,只需要在 useEffect 第二个参数声明依赖项即可,例如

Live Editor
Result
Loading...

模拟 componentWillUnmount

只需要在 useEffect return 一个新的函数即可。

Live Editor
Result
Loading...

useEffect 和 useLayoutEffect 的本质区别

useEffectuseLayoutEffect 其实功能基本一样的,两者的本质区别是:

useEffectuseLayoutEffect 的本质区别就是在 useLayoutEffect 执行的时机是在 DOM 修改后同步触发。

先来看看下面的例子,我们来看下两者执行的时机:

useEffect vs useLayoutEffect

useEffect vs useLayoutEffect result

通过上面例子可以看出,useEffectuseLayoutEffect 都是在状态变更之后才会执行的,并且 useLayoutEffectuseEffect 提前执行。

Live Editor
Result
Loading...

总结

  1. 官方推荐,绝大部分场景下使用 useEffect hook 即可,如果 useEffect 不满足需求,再尝试使用 useLayoutEffect hook。
  2. useEffect 是异步非阻塞,useLayoutEffect 是同步阻塞。
  3. useEffect 是在浏览器绘制之后执行,useLayoutEffect 是在 DOM 变更之后,浏览器绘制前执行
  4. useLayoutEffect 会阻塞 DOM 的渲染,避免过度使用