第二組讀書會 3-1 ~ 3-2 #27
judy152534
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.
-
導讀人: Robert
筆記工: Var
[本週簡報連結]
2024/4/17 3-1 ~ 3-2
1. 導讀討論
(1)batch update細節:Execution Queue與合併計算
舉例:the handleButtonClick
第7行時,Execution Queue 被塞進前面三個
setCount
直到 function block 中所有程式結束後,開始 re-render 時,才會進行 state 的合併計算。

(2)為何執行 flushSync()之後,取到的 state 依然是舊的?
flushSync()
執行完:2. 觀念自我檢測
(1) 為什麼 React 並沒有而且也不需要子 component 向上溝通父 component 的專門機制?
將
setState
方法以 props 往下傳遞給子 component(component props 傳遞的資料型別沒有限制)
setState
方法會更新 state 以及觸發 re-render 的 component 是固定的(2) 如何在子 component 中觸發更新父 component 的 state 資料?
setState
直接或是加一些邏輯封裝成自定義的新函式透過 props 傳遞到子 component 中。(注意:不一定要把
setState
傳遞下去)setState
,或是呼叫包含該setState
的自定義函式,並在希望觸發資料更新的地方呼叫它。(3) 什麼是 batch update?
指在單一事件中,多次呼叫了
setState
方法後,React 會自動依序合併試算 State 的目標更新結果,最後統一呼叫一次 re-render 來完成畫面的更新。除了可以優化效能,也能預防以半成品的方式重新渲染。(4) 如果想要手動指定某些 setState 方法的呼叫不要 batch update 時,可以怎麼做?
可使用
flushSync
方法來達到,只要將setState
方法的呼叫放進flushSync()
的 callback 函式中,React 就會以同步的方法立即性的觸發 component 的 re-render,並完成實際 DOM 的操作更新。(5) 什麼是 uupdater function?比起直接指定新的 state 值來說有什麼好處?
3. 問題討論 & Zet 的講解
3.1. 是否每次都要優先使用 updater function?
setCount
,但其實實務上很少用到,會直接指定值3.2. 什麼時候不適合使用 updater function?
舉一個不適合使用 updater function 的反例:
當使用非同步呼叫
setState()
,但又想取特定時刻的statesetCount()
,且裡面傳 updater function,非同步的updater function 取出的會是目前內部 state 最新的值,會錯誤的取出最新的值,造成結果不如我們的預期非同步呼叫時,可能 component 在那之前有先 re-render 過 state,所以最後拿出的state 可能不符預期
多數實務情況下,會直接拿那次 render 版本的 count 來更新值,如:
setCount(count + 1)
4.3. 討論區題目
setState
後會用Object.is()
比較新舊值來決定要不要 re-render,兩者的先後順序是什麼或是否有衝突? (換句話說,state 值的更新計算在何時發生? re-render 前還是後?)code example: https://codesandbox.io/p/sandbox/updater-function-de-zhi-xing-shi-ji-8s2wq9?file=%2Fsrc%2FApp.jsx
state 具體何時被更新?

setState
後會先比較新舊值以確認要 re-render,在 re-render 時會再次執行到useState
,此時執行useState
時才會去看 state 的待執行佇列,並合併計算、得到最新的 state 值,拿出最新的 state 值回傳,此時才拿到最新的 state 值useState
之前,state 還是舊的,執行useState
時才會去做值的更新,在那之後才會拿到更新後的 state 值React 怎麼知道要不要 re-render?
setCount(count+1)
,因為已經給了固定值,React 知道這個值是什麼,新舊值比較下知道不同,所以會觸發 re-rendersetCount(n => n + 1)
setCount(n => n + 1)
裡面的 updater function,去看值會是什麼,計算後才能檢查這個 state 和舊的是不是一樣useState
的執行前取得該 state 值,仍然會是舊的 statestate 的待執行 queue 具體執行時間不一定
useState
呼叫前,一樣還是拿到上次 render 的舊值useState
時才會做計算並更新用 class component 的方式可以拿到這個 component 的 fiber node
DEMO 連結:點我
Beta Was this translation helpful? Give feedback.
All reactions