React
Optimize
Hooks
useCallback
OptimizeRender
React 優化項目系列,減少大量且不必要的元件重新渲染週期
如何觸發更新的
紀錄 props value
紀錄 func 記憶體位置
紀錄 object value 避免重複執行相關處理
延續上一篇文章範例,把 Button 包成一個元件傳進一個 event function,加上 log 以及 React.memo
測試。
瀏覽器執行時可以發現,就算 Button 元件加上了 React.memo,但還是會進行更新。 這是因為 javascript 傳值與傳址的特性
當父層元件更新時 toggleParagraphHandler
func 重新創造了一次(re-creation),產生了新的記憶體位置。所以對 React.memo
來說,這個 func 是不一樣的
React.useCallback()
使用
React.useCallback
紀錄 func 記憶體位置,避免re-creation
為了避免 toggleParagraphHandler
func re-creation
,加上 useCallback
很棒! Btn RUNNING
不見了
allowToggle
stateallowToggle
allowToggle
為 true 時,就能夠切換 toggleParagraph
範例執行時可以發現,當我點擊 allowToggleHandle
更改 allowToggle
為 true 時,再點擊 toggleParagraph
是無效的
這就是 js 閉包的特性,他已經把 allowToggle false 記住了,更新時他卻不知道。
為了通知 toggleParagraph
需要更新可以在 useCallback
的 dependencies
加上 allowToggle
。
這樣一來當 useCallback 就會去偵測 allowToggle 是否有改變,有的話就更新 toggleParagraph
重新執行,一切正常,真棒~