第 4 組讀書會 5-4~5-7 #54
webdevbyjasmine
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.
Uh oh!
There was an error while loading. Please reload this page.
-
5-4-5-7
日期:2025/6/3
導讀人:Stella
筆記工:Jasmine
簡報
5-4為什麼在 react18 的嚴格模式會在 mount 時自動被執行兩次?(嚴格副作用模式)
因為嚴格模式的功能,啟動嚴格模式+開發環境版本下才會如此。
偵測不安全的副作用(side effects)
React 想幫你確認某些副作用函式(例如:useEffect、useState 的初始行為、訂閱事件等等)在多次執行後仍是安全、可重複執行的。
例如你在 useEffect 裡訂閱了一個事件,但沒有妥善清除(cleanup),那就會導致記憶體洩漏或重複綁定。
提升函式元件的可重用性(Reusable State)
為了支援未來像是「自動快取」或「並行模式(Concurrent Mode)」等功能,React 需要確保元件副作用是可預測與無副作用污染的。
所以會模擬「重複初始化與卸載」來檢查程式碼是否穩定。
Reusable state是什麼?為了滿足 reusable state 對於程式碼彈 性的要求,我們應該要讓副作用的設計滿足什麼目標?
🔸 React 可以暫時「卸載」元件,保留它的狀態(state),然後在需要時再「重新掛載」這個元件,而不會重置其狀態或破壞其邏輯。
✅ 設計目標:
useEffect
的 dependency array 裡不要放與副作用無關的東西,避免因為不必要的 re-render 重新執行 effect。5-5 副作用處理情境設計技巧
我們要如何解決副作用設計中「疊加性質而非覆蓋性質的操作」的問題?
要設計一個 cleanup 函式,疊加性質:指本身的副作用,比如說同樣的變數取代前一個(可覆蓋掉)就不算是疊加,如果是導讀人舉例的SetTimeout會疊加(會一直存在),導致產生memory leak
我們如何解決副作用設計中「race condition」的問題?
利用
cleanup function
設立 flag 避免 race condition這是一種常見又實用的寫法,基本邏輯如下:
useEffect
執行時建立一個「是否已取消」的 flag。true
。這樣可以避免「上一個請求回來時覆蓋了新的狀態」的狀況。
📘 書中提到的第三方套件(例如 React Query)
有時候處理非同步請求與快取等細節太麻煩,也可以考慮使用現成的套件來處理,例如:
5-6useCallback & useMemo 使用的正確時機
useCallback記憶傳入的函式參考,只有在 dependencies 改變時才會回傳新的函式
它本身不會帶來效能優化,而是搭配其他效能優化工具(例如
memo
)一起使用時才會有效果✅ 使用方式與重點說明整理
React.memo
,useEffect
,useMemo
使用useCallback
控制它們的「改變時機」useCallback
雖然看似簡單,但其實牽涉到元件資料變動與渲染效能的議題,使用上要依照實際需求來判斷是否有必要使用。過度使用反而會讓程式碼更複雜,沒有真正的效能提升。useCallback
正確的用途以及適當的使用時機是什麼?如果依賴項是函數的話**
useCallback
連動的副作用 讓useMemo
&useEffect有依賴項變動才會變動**正確的用途是「讓我們的函式能夠反應資料流的變化」
•傳透給子 component或效能優化的情境,特別搭配 memo使用時,可避免不必要的 re-rendero
•搭配 useEffect 的 dependencies 列中,也能確保不會因為函式參考婆動導致副作用重複執行
useMemo
正確的用途以及適當的使用時機是什麼?正確用途:
useCallback
本身是一種useMemo
5-7Hooks 的運作原理和設計思維
Zet Q&A
看到一個語言或框架時,應該思考它背後是如何實作出這些功能的原理。
在自己實作功能的時候,也要試著去思考,有沒有更好的實現方式。就算當下時間不夠,也可以先把新的想法或做法記錄下來,起碼有想過,或是日後再深入研究。
在進行 Code Review 前,應該先自己思考、嘗試解決問題,再去尋求他人的建議或答案。
Beta Was this translation helpful? Give feedback.
All reactions