useEffect 和 useLayoutEffect淺析

執行時期的區別

useEffect 回調函數的執行時期

useEffect為非同步執行,執行時期為

  • 觸髮狀態更新(如:setState,forceUpdate)
  • React渲染函數執行(render)
  • 將更新渲染到頁面上
  • 執行useEffect回調函數

useLayoutEffect 回調函數的執行時期

  • 觸發更新
  • React渲染函數執行
  • 同步執行 useLayoutEffect回調函數 (如果此函數中存在 觸發更新操作,如setState,會放棄本階段的頁面渲染,先執行更新然後再統一進行渲染)
  • 將更新渲染到頁面上

對比後得到兩者區別

  • 執行時期的區別,useEffect回調是在更新渲染到頁面以後非同步執行 而 useLayoutEffect是在更新渲染在頁面前同步執行。造成的影響是,useLayoutEffect 回調中如果有耗時操作會阻塞頁面的渲染,造成性能問題。

  • 兩者中如果調用setState更新狀態,都會再次執行render,區別是 useEffect會進行兩次頁面更新渲染,useLayoutEffect只會執行最後一次頁面更新渲染。所以,看到的結果是使用useEffect時候執行更新頁面上會出現閃爍,而useLayoutEffect確不會

  • useLayoutEffect 的執行時期 同 class組件生命周期 componentDidMount 和 componentDidUpdate

所以,得出的結論是,大多數的場景中都應該使用useEffect來實現我們的邏輯,僅僅在一些特殊情況,比如需要去監聽同步更新狀態防止頁面煽動時才需要useLayoutEffect。