博客 / 詳情

返回

useEffect底層實現原理,useEffect和useLayoutEffect的區別

useEffect鏈表
通過MountEffect方法把callback/依賴項加入到鏈表中
視圖更新完畢,基於UpdateEffect方法通過effect鏈表中的callback按照要求執行

image.png

useEffect和useLayoutEffect

組件渲染過程
1.基於react-app編譯,基於babel-preset-react-app把jsx編譯成createElement格式
2.把createElement執行,創建virtualDOM
3.DOM-DIFF 渲染為真實dom
3.1.root.render方法,需要的DOM對象都創建出來 //useLayoutEffect
3.2.瀏覽器繪製和渲染 //useEffect

如果鏈表中的callback執行又修改了狀態值【視圖更新】對於useEffect來講:
第一次真實DOM已經渲染,組件更新會重新渲染真實DOM;所以頻繁切換的時候,會出現樣式/內容閃爍
對於useLayoutEffect來講,第一次真實DOM還未渲染,遇到callback中修改狀態,視圖立即更新,創建出新的virtualDOM合併在一起渲染為真實DOM,也就是在此類需求下,真實DOM值渲染一次,不會出現樣式/內容閃爍
useLayoutEffect會優於useEffect先執行
useLayoutEffect
其函數簽名與 useEffect 相同,但它會在所有的 DOM 變更之後同步調用 effect
可以使用它來讀取 DOM 佈局並同步觸發重渲染。
在瀏覽器執行繪製之前(還沒有繪製成真實DOM),useLayoutEffect 內部的更新計劃將被同步刷新。
useLayoutEffect會阻塞瀏覽器真實DOM,優先執行Effect鏈表中的callback
儘可能使用標準的 useEffect 以避免阻塞視覺更新

user avatar ivyzhang 頭像 suporka 頭像 thepoy 頭像 lidalei 頭像
4 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.