第二組讀書會 5-6 5-7 #45
steward379
started this conversation in
General
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
-
useCallback
與useMemo
與 Hooks API 設計思維useCallback
與 render首次 render 時:
useCallback
會接受你所傳入的函式以及 dependencies陣列,記憶起來做為快取然後再將傳入的此函式回傳。
後續 re-render 時:
所有依賴項目的值與前一次render 時的版本進行比較
相同 => 忽略,回傳前一次的舊版函式
不同 => 記憶新傳入的函式和 dependencies 陣列,覆蓋舊的。回傳新的
💡每次 render 的過程中都會先 inline 建立一個
函式,然後才作為參數傳給
useCallback
render案例
核心目標:「讓函式能夠反應資料流的變化」
dependencies 誠實,但是新函式效能優化永遠都會失效,因為會重新 render
=> 使用
useCallback
, 則裡頭依賴了任何資料,只有在該資料變動時,useEffect
的副作用才會被執行。useCallback 搭配例子ㄧ:
useCallback案例
useCallback 搭配例子二:
useCallback案例二
Zet 文章
useCallback 官方文件
協助 Memo
不斷重新產生函式,所以 memo 沒用
Alert 失敗案例
useCallback
,不重新分配記憶體位址,就可協助Memo
正確感知到資料流變動,效能優化就能成功Alert 成功
與
Memo
的關係:配合
memo
:快取 "component" render 的畫面結果並重用,『可節省效能成本』內建的
Memo
Memo
官方文件useCallback
只能在 component 頂層呼叫
『不可以』效能優化
記憶『函式本身』
協助其他效能優化正常運作
第一個參數是 function (函式)
第二個參數可選,是 dependencies(依賴項)
接受你所傳入的函式以及 dependencies 陣列,
記憶起來做為快取然後再將傳入的此函式回傳。
useMemo
useMemo 官方文件
useMemo
用例MemoizedChild 的 render 效能優化效果永遠都會失效
因為 number 陣列在每次 render 時都是全新的不同陣列
以
useMemo
進行快取陣列資料, numbers 陣列就不會每次 render 時都不同什麼時候該使用 useMemo 跟 useCallback(iChef)
Hooks 運作原理與思維
- 只能在頂層呼叫
⌚️ 描述「某個歷史時刻」的畫面結構 => React element
📰 儲存「最新狀態資料」的畫面節點 => fiber node
fiber node:
保存並維護目前 React 應用程式的最新狀態資料,個應用程式之中只會存在『一份』
Fiber Node
Component 實例
re-render 後資料本體就真的會被覆蓋更新
呼叫多個
useState
後:hooks 依賴固定呼叫順序:
錯置範例
Hooks 的目標
Hooks API 設計思維
💡👼 Zet:
useMemo
可以拿來存函式!useCallback
本身是一種useMemo
就像
useState
是一種useReducer
的限制性版本💎 鑽石問題
💡👼 Zet: 建立函式白作工的效能影響不大
雖然
useMemo
可以取代useCallback
還能省函式,但沒差,而且 JavaScript 有記憶體回收機制,函式沒在用就會回收如果傳給
useMemo
,第一個參數每次都會建立一個函式再傳給
useMemo
,比較後發現相同就不會建立函式Beta Was this translation helpful? Give feedback.
All reactions