深入理解 useEffect
前情提要
剛開始學 React 的時候,我對 useEffect 的理解就是「用來處理副作用的 Hook」,然後就開始到處亂用 XD。後來在實際專案中踩了不少坑,像是無限迴圈、Race Condition、不必要的 re-render 等等,才發現自己對 useEffect 的理解 太淺了。後來讀了 Dan Abramov 的 A Complete Guide to useEffect 這篇經典文章,才終於建立起正確的心智模型。這篇文章整理了我對 useEffect 的理解,希望能幫助路過的讀者少走一些彎路。
useEffect 的核心概念
useEffect 是 React 中用於處理 副作用 (Side Effects) 的 Hook。副作用指的是任何與外部系統互動的操作,例如:網路請求、DOM 操作、訂閱事件、計時器等。
基本語法
useEffect(setup, dependencies?)
setup: Effect 函數,可選 擇性回傳一個 cleanup 函數dependencies: 依賴陣列,決定 Effect 何時重新執行
依賴陣列的三種情況
| 依賴陣列 | 執行時機 |
|---|---|
| 不傳入 | 每次 render 後都執行 |
[] 空陣列 | 僅在 mount 時執行一次 |
[a, b] | 初始 render 及 a 或 b 變化時執行 |
小提醒
依賴陣列中的比較是使用 Object.is 來判斷的,這意味著如果依賴項是 object 或 function,每次 render 都會被視為「新的」,很容易造成非預期的重新執行。