useEffect和useLayoutEffect區(qū)別
useEffect
基本上90%的情況下,都應(yīng)該用這個,這個是在render結(jié)束后,你的callback函數(shù)執(zhí)行,但是不會block browser painting,算是某種異步的方式吧,但是class的componentDidMount 和componentDidUpdate是同步的,在render結(jié)束后就運行,useEffect在大部分場景下都比class的方式性能更好.
useLayoutEffect
這個是用在處理DOM的時候,當(dāng)你的useEffect里面的操作需要處理DOM,并且會改變頁面的樣式,就需要用這個,否則可能會出現(xiàn)出現(xiàn)閃屏問題, useLayoutEffect里面的callback函數(shù)會在DOM更新完成后立即執(zhí)行,但是會在瀏覽器進行任何繪制之前運行完成,阻塞了瀏覽器的繪制.
可能講的不是很清楚,看個例子吧
import React, { useEffect, useLayoutEffect, useRef } from "react";
import TweenMax from "gsap/TweenMax";
import './index.less';
const Animate = () => {
const REl = useRef(null);
useEffect(() => {
/*下面這段代碼的意思是當(dāng)組件加載完成后,在0秒的時間內(nèi),將方塊的橫坐標位置移到600px的位置*/
TweenMax.to(REl.current, 0, {x: 600})
}, []);
return (
<div className='animate'>
<div ref={REl} className="square">square</div>
</div>
);
};
export default Animate;
gifhome_1536x760_5s.gif
可以清楚的看到有一個一閃而過的方塊.
改成useLayoutEffect試試
gifhome_1536x760_5s (1).gif
可以看出,每次刷新,頁面基本沒變化
I believe your apartment is on fire