2017-10-17 200 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