筆記----深入淺出《React和Redux》第三章Redux框架 (使用React-Redux庫)
在直接使用React-Redux庫之前,需要做一個鋪墊
三、容器元件(也叫Smart Component)和展示元件(也叫Dumb Component)
1、用處:這個知識點主要建立在上一章基礎上,在上一章中Redux和React進行配合,單個元件處理的任務太多,為了“讓每個元件專做一件事”,把元件按處理的任務型別進行拆分,分成容器元件和展示元件,以下是他們的分工
展示元件:接受props,並渲染出來
容器元件:和Store打交道,處理State
2、容器元件和展示元件是父子級元件關係,容器元件在外層,展示元件在內層
展示元件就是一個純函式,根據容器元件傳遞過來的props進行渲染
3、程式碼實踐 (修改Counter.js檔案)
此次把之前的Counter元件,按功能分成兩個元件,一個是Couter,作為展示元件,另一個是CounterContainer,作為容器元件
Counter
CounterContainer
在這裡CounterContainer(外層的容器元件)負責和Store進行互動,並將從Store中獲取到的狀態,通過props傳遞給Counter(內層的展示元件),然後展示元件將拿到的props值進行渲染,然後在結果一層層的提交出來。在總體看來,和之前的效果一樣,但是分工更加細緻了
另外,React 支援用函式來表示無狀態元件,展示元件Couter也可以寫成,結果一樣生效
最後結果:
四、元件Context
1、用處:提供全域性的store,不用考慮store檔案在哪個位置,而避免react元件引入store帶來的麻煩,
實現方式就是把這個store塞進元件的context屬性中,這樣子每個元件都能直接訪問到store的狀態值了
2、在根元件中,將store放入context,之後其他所有子元件就可以通過this.context.store訪問到context中store,從而避免了多次引入store帶來的麻煩
3、程式碼實現
書中是按context舊版本使用方式,新版使用方式雖然略有不同,但是整體思路還是差不多
在主入口檔案中App.js
說明:為了不是ControlPanel元件工作變得複雜,在此另寫一個根元件Provider,並將store引入,作為Provider元件的屬性值
Provider.js
關鍵的步驟來了,這一步是將store塞進context中,方便之後的子孫元件們輕鬆呼叫。
注意注意!!!!!
(i)這裡使用到了需要藉助一個函式getChildContext(),他會返回一個context物件,我們需要把store放在這裡面
(ii)在這裡還需要用childContextTypes指定context的結構型別,如不指定,會產生錯誤
此時如果將指定型別註釋了
可以看出getChildContext和childContextTypes搭配使用
ControlPanel.js
這個保持不變
Counter.js
這個元件作為PropTypes子元件,可以從context拿去store,而不需要像之前一樣,在當前元件中引入store檔案之後才可以訪問子元件
注意注意!!!!!
在需要呼叫store的元件中,首先在constructor和super中加入引數context,進行初始化
然後使用contextTypes指定的store結構型別,記住,如果contextTypes沒有被定義,context只是一個空物件
為了在控制檯看一下效果,我們列印當前元件進行觀察
對比註釋前後的變化
最後可以通過this.context.store進行訪問了
總結:舊版本使用需要
根元件:
getChildContext()放入需要共享的資料
childContextTypes指定context中資料的資料型別
子元件:
contextTypes指定需要接受的context中哪一部分的資料型別
五、react-redux
之前三和四的“容器/展示元件”以及“訪問store方式”,實現“react-redux”庫中最主要的兩個功能:
(1)connect:連線容器元件和展示元件;
(2)Provider:提供了包含store的context
1、使用react-redux之後的程式碼
Summary.js
因為展示元件不涉及狀態,在這裡我以函式形式進行書寫,可以對比下面的Summary展示元件以類的形式書寫
Counter.js
App.js入口檔案
其他程式碼照舊
(1)connect:
connect(mapStateToProps,mapDispatchToProps)(Counter)
這個方法接受兩個引數mapStateToProps和mapDispatchToProps,執行結果仍然是一個函式,所以之後繼續加了一個小括號,其中小括號裡放了展示元件,經過這兩個執行後產生容器元件
mapStateToProps和mapDispatchToProps是兩個函式,mapStateToProps負責將Store上狀態轉化為內層元件的props,mapDispatchToProps負責將動作進行派發
(2)Provider
react-redux中封裝了類似我們之前寫的Provider類,但是裡面更加嚴謹,比如不僅要求store是一個object,還要求store是一個包含subscribe,dispatch,getState函式的store
部分參考
https://reactjs.org/docs/legacy-context.html