第二組讀書會 5-1~5-2 #38
MiJouHsieh
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.
-
《React 思維進化》讀書會第二組 5-1~5-2
20240529 5-1~5-2
導讀人:Cheryl
筆記工:Mi
簡報
補充資料
class component生命週期API
Youtube:
React Component Lifecycle - Hooks / Methods Explained
可以記以下4個方法
constructor
componentDidMount
componentWillUpdate
componentWillUnmount
dependencies 能不能放 Object?
React官網:
Removing unnecessary object dependencies
問題情境:
在元件中定義
options
object ,且effect函式依賴options
object ,所以dependencies
中寫入options
。但在每次元件渲染時會重新建立object ,
dependencies
判斷和上次render時的object 不一樣,就會執行副作用處理。⇒
dependencies
效能優化失效修改:
避免使用每次render而產生的object作為依賴資料。
將
options
放入 effect函式中定義,將options
object 中的roomId
,以roomId
值的原始型別作為依賴資料去判斷資料有無更新,才執行副作用處理。有依賴項存在,又不想多次執行effect函式時,不欺騙dependencies的作法:
觀念自我檢測
5-1
(1) 什麼是副作用? 為什麼需要透過
useEffect
在React component function中處理副作用?useEffect
處理副作用解決2個問題:(2)以
useEffect
處理一段副作用的三大步驟是什麼?useEffect
預設行為。(3) 解釋每次render都有其自己版本的effect與cleanup函式是什麼意思?
每次render都會產生新的 effect函式、cleanup函式,且該次render的元件資料(props、state)是固定不變的快照值。
effect函式和cleanup函式因 JavaScript closure特性,可讀取該次render的元件資料。
所以不同次render的元件資料,為獨立不互相影響。
比如,當要執行cleanup函式時,會讀取到前一次render的快照資料,也就是每次render都有其自己版本的effect與cleanup函式。
(4)一次render中的effect函式與cleanup函式會在什麼時間點被執行?
搭配元件實例的生命周期三階段
5-2
(5)
useEffect
是 function component 生命週期API嗎?為什麼?不是。
useEffect
不論執行多少次,讓資料流和程式邏輯保持同步化到副作用處理是正確的結果即可。而不是像生命週期API關注函式的執行時機和次數。(6)為什麼React要以
useEffect
的資料流同步化這種設計來取代生命週期API?因為在class component生命週期API中,有以下缺點:
在function component 中止需要一個
useEffect
方法,使維護成本下降。宣告式程式設計,不在乎過程中函式的執行時機和次數,只要預期結果正確即可。
(7)
useEffect
的dependencies
機制設計目的與用途是什麼?目的: 效能優化
dependencies
陣列中的資料,以Object.is
方法判斷與前一次render的版本的值比較,若相同就可以避免不必要的副作用處理。若不相同就執行副作用處理。(8) 可以用
dependencies
參數模擬 function component 生命週期API的效果嗎?不行。
因為
dependencies
用途也不是用來模擬生命週期: 在特定時機執行函式和次數。dependencies
是以依賴項的值有無改變,避免不必要副作用處理,是一種效能優化手段,一種"有也很好,但沒有也不會怎麼樣"的優化方式。要根據實際effect函式有無依賴資料誠實填寫
dependencies
。即使資料沒更新,而跳過副作用處理,都不是一定保證的。
若欺騙
dependencies
來模擬 function component 生命週期API的效果,可能會使程式碼有危害。問題討論和其他補充
Q1: render之後才執行 effect函式,後端來的資料是在什麼時候取得嗎?
A:
useEffect
在元件首次渲染後執行。因此,第一次渲染時,元件內部的狀態資料通常是初始值(例如,null
或空陣列)。這時候,useEffect
會被呼叫來發送 API 請求,然後等待後端返回數據。當數據到達時,狀態會更新,這會觸發元件的重新渲染。所以,在第二次渲染時,元件就能正確顯示來自後端的數據。Q2: 有沒有辦法知道 useEffect 在 component render 後是哪些依賴項觸發了 useEffect 的執行?
A: React 並沒有內建的功能來直接告知究竟是哪個依賴項發生了變化而觸發
useEffect
。Git 圖形用戶界面 (GUI) 工具,進行版本控制操作。
Warp Terminal 終端應用程序,具有AI 功能,可以查詢指令。
git 練習資源 https://learngitbranching.js.org/?locale=zh_TW
Beta Was this translation helpful? Give feedback.
All reactions