说,我有这样的商店:
{
modules: {
myModule: {
aFlag: true,
anotherFlag: false,
nestedItem: {...}
},
...
},
entities: {...},
...
}
和modules
reducer是combineReducers({myModule: myModuleReducer})
在myModuleReducer
内部我想将nestedItem
的处理委托给另一个reducer,因此myModuleReducer
会处理aFlag
和anotherFlag
的操作,而nestedItem
则会由nestedReducer
处理。
我该怎么做?
如果我为这些标志创建一个嵌套的命名空间,那么combineReducers
就很容易了,即如果我有
myModule: {flags: {aFlag: true, anotherFlag: false}, nestedItem: {...}}
我可以做myModuleReducer = combineReducers({flags: flagReducer, nestedItem: nestedReducer})
但是,如果我不想为这些标志创建命名空间并希望myModuleReducer
处理这些标记,而我希望nestedReducer
处理nestedItem
,该怎么办?
我想出了一个"模式"像这样,使用reduce-reducers
包:
const nestedReducers = combineReducers({
// defaults for slices of state not handled by nested reducers
aFlag: (state = initialState.aFlag) => state,
anotherFlag: (state = initialState.anotherFlag) => state,
// nested reducers for particular slices of state
nestedItems: nestedReducer
});
然后
const finalReducer = reduceReducers(nestedReducers, myModuleReducer);
这种方式似乎使nestedReducer
句柄nestedItems
切片和myModuleReducer
处理状态的顶级部分(即aFlag
和anotherFlag
字段)
但我不喜欢我需要为嵌套的reducer处理的所有内容传递这些默认函数。可以避免吗? (当然,我可以将其抽象为某种nestReducers
助手,但仍然如此)。一般来说,我的方法有什么问题?
答案 0 :(得分:1)
您可以随时在myModuleReducer
功能中手动执行此操作,如下所示:
function myModuleReducer(state = someInitialState, action) {
// Call nestedReducer here
const reducedNestedItem = nestedReducer(state, action)
switch (action.type) {
case 'MY_ACTION_TYPE':
return Object.assign({}, state, {
aFlag: // aFlag logic
anotherFlag: // anotherFlag logic
nestedItem: reducedNestedItem
})
default:
return state
}
}
你只需要确保你这样做是否符合Redux的纯洁哲学。