You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
-
2024/3/17 2-6 ~ 2-7
簡報: https://hackmd.io/@pinkymini/S1tYH5bTa#/
導讀人: 粉粉
筆記工: Vera
2-6
單向資料流
單向資料流常見應用
資料 -> DOM 實際渲染的策略:
前端框架中的應用
雙向綁定
onChange
事件,瀏覽器可以直接蓋回資料,不需要人工處理。相對而言,單向資料流:e.g. React 需要使用setState
去更動資料。2-7
component
component 定義&呼叫
props
props.price
children
Object.freeze(props)
做處理,避免不小心改動到。如果指向到同一個記憶體位置,即使值不同,Object.freeze()
也不會起作用父 component 與子 component
component 的 render 和 re-render
Q & A
Q: 當第一個H2Component有狀態的更新時,會發生什麼事?
A: 呼叫第一個 H2Component 的 component function,依序呼叫裡面的 PComponent 進行 render。不會影響到第二個 H2Component,因為只有第一個 H2Component 的狀態更新。
Q: 試著講出一個內含子component的父component在資料更新後,會發生哪些事情?
A: 父 component 更新,會觸發子 component 的 re-render
Q: 滾動時畫面為什麼那麼卡?
A: 父層 position 一直被更改,因此子層會不斷 re-render。
解法:

將不能更動的子層 components 包成 slowComponent。在新舊比對中,因為原本的版本因為每次創建都是新的 object,記憶體位址也不相同,所以會需要不斷改動,但以下方解法在比對中是相同的,就可以避免多餘的 re-render。
Q: 雙向資料流在 React 上的實作
A: React 本身沒有雙向資料流,也做不到。該情境會使用 state 管理資料,將 state 設定在 input 上,觸動事件去觸發 setState 做更改,i.e. 單向資料流的設計需要開發者自己去處理這段。
Q: P.141 筆者思維分享與高內聚低耦合之間的 trade-off 設計?
A: (component 設計心法,Zet 的經驗,是沒有特定解答的。如果要認真回答可以寫一本書。)
設計不能只是單純處理眼前情境,需要思考抽象意義分層,e.g. 兩個長得很像但實際不一樣的功能,就不能設計在一起,A、B props 都不重複
=> 拆解分層、抽出共同部分。可以拆很多層,不同層都有它特定的意義,避免拆很多卻不能定義清楚它的意義。從意義去思考,而不是單純讓它動起來。
-> Q: 這是讓元件變成 presentation component 和 container Component 嗎?
A: 這只是部分概念。開發者也可以每一層都有資料邏輯,不過每一層都有它的意義範圍。
-> Q: 考慮 MVC 方式去拆分component 嗎?
A: 前端不太用 MVC,component 不是用 MVC,component 主要是增加獨立性、降低耦合性,有他自己的邏輯、樣式模板。
補充
補充 1
P.115 React element 類型非 componet 實例。componet 實例才擁有自己的狀態
補充 2
Discord 相關問題參考
React.createElement()
?<App />
與App()
的差異1.1 是否會被立刻執行?是否會被當成 component 實例?
1.2 React 以是否透過
React.createElement()
呼叫 來判斷是否是 component,而不是透過 function name 是否開頭為大小寫。透過 function call 的方式不會產生 component 實例(可使用 React dev tool 去證實)延遲執行:執行完
React.createElement()
,但還<Foo/>
沒有實際被 call 到好處:可以在內容沒有被更動時,不去 re-render。
到 line 14 還沒執行
<Foo/>
,component return 後會去 reconciler 觀察是否轉換成 DOM element,之後才會交給 renderer 去處理 DOM element。可參考 P.134 範例。React element 被 return 後才會執行 P.136 的流程。
如果物件不變,會跳過
<Foo/>
,直接沿用上一次的結果。props 不固定的情況:可以使用 component 類型的 React element,讓延遲執行下的比對,記憶體位置是一樣的,就會會去沿用上一次的內容。
Beta Was this translation helpful? Give feedback.
All reactions