useEffect 是官方推荐拿来代替 componentDidMount / componentDidUpdate / componentWillUnmount 这 3 个生命周期函数的,但其实他们并不是完全等价,useEffect 是在浏览器渲染结束之后才执行的,而这三个生命周期函数是在浏览器渲染之前同步执行的,React 还有一个官方的 hook 是完全等价于这三个生命周期函数的,叫 useLayoutEffect 这两者的区别可以看一下这个例子( codePen):
`
const App = () => {
const [count, setCount] = React.useState(0);
React.useEffect(() => {
// 耗时 300 毫秒的计算
const start = +new Date();
while (+new Date() - start <= 300) {
continue;
}
if (count === 0) {
setCount(Math.random());
}
}, [count]);
const handleClick = React.useCallback(() => setCount(0), []);
return <button onClick={handleClick}>{count}</button>;
};