使用Redux管理React數據流要點淺析



在圖中,使用Redux管理React數據流的過程如圖所示,Store作為唯一的state樹,管理所有組件的state。組件所有的行為通過Actions來觸發,然后Action更新Store中的state,Store根據state的變化同步更新React視圖組件。

那么Store是如何和視圖綁定的呢? 
在主入口文件index.js中,通過Provider標簽把Store和視圖綁定:

<Provider store={store}> //項目代碼 </Provider> 

在項目中,Store是如何具體管理State呢?實際上是通過Reducers根據不同的Action.type來更新不同的state,即(previousState,action) => newState。最后利用Redux提供的函數combineReducers將所有的Reducer進行合並,更新整個State樹。

在Redux項目中,利用Container容器組件作為橋梁,將React組件和Redux管理的數據流聯系起來。Container通過connect函數將Redux的state和action轉化成展示組件即React組件所需的Props。

//將state.data綁定到相應的React組件的Props的data function mapStateToProps(state){ return { data:state.data } } //將actions的所有方法綁定到相應的React組件的Props上 function mapDispatchToProps(dispatch){ return bindActionCreators(actions,dispatch) } //通過react-redux提供的connect方法將我們需要的state中的數據和actions中的方法綁定到相應的React組件的Props上 export default connect(mapStateToProps,mapDispatchToProps)(reactComponent) 

通過上面的分析,我們總結為一幅更詳細的圖示:

注冊Store:

//applyMiddleware可以包裝Store的dispatch,thunk的作用是使action創建函數可以返回一個function替代action對象 const createStoreWithMiddleware = applyMiddleware(thunk)(createStore) ... ... const store = createStoreWithMiddleware(reducer,initialState) 

這里可能有同學會有疑問,React的state和Redux所說的state是同一回事嗎?下面我們簡要分析一下:

首先,React組件的state和props定義如下:

state-只表示一些臨時的、內部的狀態數據,例如窗口的打開或關閉狀態。

props-通常存儲一些方法,一些可能需要庫存的長期數據和一些需要傳遞的共享數據。

然后,Redux和React基本上只有2種聯系:

要么React從Redux的state中讀取數據,要么React通過dispatch分發action到Redux,Redux的reducer來返回一個新的state。

結論是Redux的state存放的是全局的長期數據,也就是對應的React組件的Props數據,而組件React的state應該是臨時的內部狀態數據,所以這兩個state沒有半毛錢關系。

下面我們總結一下Redux的三大原則和數據流的管理:

Redux三大原則:

1、單一數據源,這個應用的state被存儲在一棵object tree中,並且這個object tree只存在於唯一的Store中。

2、state是只讀的,唯一改變state的方法就是觸發action,action是一個用於描述已發生事件的普通對象。

3、使用純函數來執行修改,為了描述action如何改變state tree,需要編寫reducer。

Redux數據流的管理:

1、action:把數據傳遞到Store,唯一數據來源。

2、reducer:action只描述有事情發生,reducer指明如何更新state,即設計state結構和action處理。

3、Store:把action和reducer聯系到一起,負責維持、獲取和更新state。

4、生命周期:數據流嚴格且單向

調用Store.dispatch(action)->Store調用傳入的reducer函數,Store會把兩個參數傳入reducer:當前的state樹和action->根reducer將多個子reducer輸出合並成一個單一的state樹->Store保存了根reducer,並返回完整的state樹。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM