Redux入門學習紀錄

離上次5/5上React入門的今天去上了Redux入門,這次課程深度滿深的。在2016年某次程式聚會聽到有人分享一些Redux,但那時我的程式能力不能理解很多很可惜。


這次做個學習紀錄,以利追蹤自己之後的學習方向:

Redux參考Flux(拉丁文,等同英文的Flow)並改善它。這兩者都是單向資料流的架構。Redux改善Flux擁有很多store會難統一應用程式狀態的缺點,規定應用程式中只能有一個store,而這store是個樹狀結構。

簡單說,Redux = Flux + Elm (Elm使用純FP最後編譯成JS的程式語言,就像TypeScript)

其實Redux不一定要搭配React使用,它可以和純JS使用。但因React本身的state都是每個元件私有的,並未有應用程式層級(相當於全域)的state,所以利用Redux的store中的state能做到全域型的state,使每個元件間容易相互溝通。

因而實務上,React中可以完全不用寫state,全部交給Redux處理。

這次最令我印象深刻的一段:
- 動作能做成一種動作描述的物件(action object)因而含key(type)和value(payload),顛覆過去我認為動作就像呼叫函式的感覺。

- action object最好透過action creator建立,方便管理且有異步東西可寫在action creator(可透過中間件達到pure function效果),然後透過dispatch統一發送。

- 老師以「發送火箭」比喻Redux的做法:payload代表火箭最頂端的太空艙,為有效資料 ;燃料部分為meta data,是為傳遞data的data;而火箭發射器就是dispatcher了。


Redux的3個基本原則:
1. single source of truth:就是只有一個store

2. state is read-only

3.changes are made with pure functions:
    - FP中reduce運算定義: (previousState, action) => newState,用意在能對應到React。
    - FP中的pure functions的合成樣式意思,e.g. f(g(h(x))),函數執行順序:h -> g -> f,而這三個函數都要是pure function。
    - pure function 有一些優點,其中我最印象深刻的是「可做cache或記憶處理,在高花費的複雜運算中可提高效能」。

pure function是為了防止函式產生副作用,以達到code易預測且封閉函式的作用域。而Redux中的不能寫到副作用,通常是指防止中度以上等級的副作用(如DB處理)。像console.log()這種隱性的副作用則可以寫。


Redux套⽤用七步驟:(此處七步驟直接copy from 老師的ppt)

1. 從redux模組中導入createStore與combineReducers函式

2. 針對狀狀態要如何處理理,撰寫純粹的reducer(歸納)函式,最
後⽤用combineReducers函式合併

3. 由合併好的reducer,建立出store

4. 撰寫⼀一個render(渲染)函式,在狀狀態有更更動時作重新渲染

5. 第⼀一次呼叫render函式,作⼀一開始的呈現

6. 訂閱render函式到store中(store.subscribe(render))

7. 觸發事件時要呼叫store.dispatch(action)

註: 這裡使⽤用combineReducers,只是要讓Redux dev tools可以正常看到store(state)的狀態變化

    - 如果Redux和React搭配使用,則步驟4~6會不見:步驟4、步驟5會交給React做render,步驟6則交給一個React元件叫Provider。Provider一定包在應用程式的最外層,如此所有store才能穿透每個元件,也就是每個元件都可呼叫store.getState()取得目前state。
    - Redux和React之間可分使用connect()的全綁定(指綁定所有action creator),或是實務中建議使用mapDispatchToProps()的部分綁定(指綁定該元件有需要用到的action creator)。


最後,一些補充:
    - 高階元件樣式是指:export default xxx(),目的是為了強化原本元件樣式和結構。
    - 複雜的狀態更動(用到很深層的狀態模型時)可搭配使用Immutable.js。
    - 這次課程未能講解到「中間件」。



留言

熱門文章