2017-10-17 201 views
1

我有一個減速reducerA看起來像這樣合併減速機在另一減速

reducerA = { 
    A: [], 
    B: {}, 
    C: {}, 
    D: [], 
}; 

我還有一個減速reducerB看起來像這樣

reducerB = { 
    E: {}, 
} 

我想什麼做的是關鍵合併reducerBreducerA並獲得一些看起來像這樣的東西

reducerA = { 
    A: [], 
    B: {}, 
    C: {}, 
    D: [], 
    reducerB: { 
    E: {} 
    }, 
}; 

reducerA函數中觸發狀態變量A,B,C和D的更改並且在reducerB函數中仍然觸發狀態變量E的更改。

我已經嘗試過使用combineReducers。但顯然,它結合了reducerAreducerB作爲外部減速器的孩子。而這需要我來訪問內部reducerA作爲reducerA.reducerA.A

export default { 
    reducerA: combinedReducers({reducerA, reducerB}) 
} 

我想知道是否有一個相當冷靜解決問題的狀態變量。我發現了很多能解​​決問題的庫。但我仍然不願意,如果可能的話,如果沒有它們,我們會解決這個問題。

回答

2
const reducerA = (state, action) => { 
    const newState = {} 
    switch (action.type) { 
    case someaction: 
     newState = { 
     A: [], 
     B: {}, 
     C: {}, 
     D: [], 
     } 
    default: 
     newState = { 
     ...state 
     } 
    } 
    return { 
    ...newState, 
    reducerB: reducerB(state, action) 
    } 
} 

這應該解決你的問題。 ; D

+0

美麗而巧妙。 – Prasanna

0

我認爲你所要求的是針對redux reducer概念並打破封裝。如果要創建一個reducerA和reducerB狀態中繼的reducer,則應該分別調度動作,分別調度reducerA和reducerB,不要依賴其他reducer。

總之,當您使用反應 - 終極版,我建議採用mapDispatchToProps,您可以創建全局狀態的映射爲組件的道具,如:

const mapStateToProps = state => { 
    return state.reducerA.foo + state.reducerB.bar 
} 

connect(mapStateToProps)(YourComponent) 
+0

我正在做的是一種遺產代碼。該代碼具有完美的運行單元測試,並通過自動和手動測試用例進行嚴格測試。所以,如果我要使用地圖狀態來訪問已經存在的結構,那麼我將不得不將地圖狀態映射到道具上。我在考慮是否存在一個很好用的解決方案,但由於看起來沒有這樣的結果,我將從庫中獲取幫助 – Prasanna

+0

當然,您可以重新使用mapStateToProps方法並避免代碼重複。 – lipp

+0

如果您可以將鏈接粘貼到可以滿足您的要求的庫,那會很好。 – lipp