Redux 中 combineReducers實現原理
阿新 • • 發佈:2018-11-06
使用 product patch 分支結構 實現原理 復合 reducer 實現 判斷 使用一個reducer
譬如,寫一個“我”的reducer:
const initialState = { id : 2, name : ‘myName‘, } import { createStore } from ‘redux‘; const reducer = function(state=initialState, action) { //... return state; } const store = createStore(reducer);
這種情況下,這個reducer函數會對所有的action進行判斷和處理,傳入的state參數是整個store中的狀態的全集。可能是這樣:
{
id : 2,
name : ‘myName‘,
}
使用combineReducers 復合多個reducer
const user = (state = [], action) => { switch (action.type) { case ‘RENAME‘: //... default: return state; } } const product = (state = [], action) => { switch (action.type) { case ‘SOLD‘: //... default: return state; } } const reducers = combineReducers({ user, product, }); const store = createStore(reducers);
這種情況下,每個reducer會對相關的action進行處理,返回與之相關的狀態。(而實際實現是,combineReducers將所有reducer合並成立一個大的reducer)。
整個store的狀態全集會是如下樣子:
{
user: {
id: 0,
name: ‘myNmae‘,
},
product: {
id: 0,
is_sold: 0,
}
}
可以看出這是一個樹形結構,每個reducer所處理的數據在自己的分支結構中。因此,每個reducer可以獨立的編寫,無需關註其他reducer的數據(state)處理方式。同樣,dispatch的時候只要發送與之相關的內容即可。
const initialState =
{
name : null,
displayName : null,
};
const me = (state = initialState, action) =>
{
switch (action.type)
{
case ‘SET_ME‘:
{
const { name, displayName } = action.payload;
return { name, displayName };
}
default:
return state;
}
};
//想要設置“我”的屬性,只要:
store.dispatch({
type : ‘SET_ME‘,
payload : { "jacky", "小王"}
});
但是,事實上每個dispatch發出之後,所有reducer都會被調用一遍(只是大部分事不關己,直接返回自己的state),最終會返回一個完整的狀態樹,就像上面看到的樣子。
編碼建議
對於復雜的應用,可以編寫多個reducer,每個reducer專註處理一類state。
可以將多個reducer的實現放到一個文件裏實現,也可以每個reducer使用一個單獨的文件(便於分工)。
Redux 中 combineReducers實現原理