React 提供了 useLayoutEffect
和 useEffect
两个 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 的本质区别
useEffect
和 useLayoutEffect
其实功能基本一样的,两者的本质区别是:
useEffect
和useLayoutEffect
的本质区别就是在useLayoutEffect
执行的时机是在 DOM 修改后同步触发。
先来看看下面的例子,我们来看下两者执行的时机:
通过上面例子可以看出,useEffect
和 useLayoutEffect
都是在状态变更之后才会执行的,并且 useLayoutEffect
比 useEffect
提前执行。
Live Editor
Result
Loading...
总结
- 官方推荐,绝大部分场景下使用
useEffect
hook 即可,如果useEffect
不满足需求,再尝试使用useLayoutEffect
hook。 useEffect
是异步非阻塞,useLayoutEffect
是同步阻塞。useEffect
是在浏览器绘制之后执行,useLayoutEffect
是在 DOM 变更之后,浏览器绘制前执行useLayoutEffect
会阻塞 DOM 的渲染,避免过度使用