useCallback
的主要用途並不僅僅是為了「節省 CPU 計算」,它更多是為了避免不必要的組件重新渲染。考慮以下情況:
- 有一個父組件和一個子組件。
- 父組件每次重新渲染時都會創建一個新的callback function。
- 這個新的callback function會作為 props 傳遞給子組件。
因為每次callback function都是新的(即使行為相同),React 會認為子組件的 props 已經改變,因此會觸發子組件的重新渲染。這就是不必要的性能開銷
情況1
如果沒有使用 useCallback,當 Parent 重新渲染時,也會重新渲染 onClick,製作新的 function 傳入 children,這會導致 memo 判斷錯誤而一樣重新渲染。
情況2
通常,如果您沒有將函數作為依賴項放入,eslint會提示 "React Hook useEffect has a missing dependency"。但是,如果您將函數放進去,又會導致在第一次渲染時製作函數,在函數完成後,由於函數的更改,useEffect再次渲染,導致函數和渲染之間的無限循環。此時,您需要使用useCallback。
useMemo也一樣
參考資料: