考虑一下:
我的应用程序最终会变得非常大。它是一个仪表板,可以让您访问各种实用程序,其中一个是todo应用程序。
如果我只想构建一个todo应用程序,那么我的状态对象将如此:
{ todos:[], completed:false, todoInput:''};
todoInput
将绑定到表单字段,点击添加后,它会更改todos
数组并切换completed
字段。所以我的combineReducers()
函数看起来像这样。
combineReducers({todos,completed,todoInput});
这是有道理的,因为所有状态都与todo应用程序相关,因为只有一个todo应用程序。
现在因为我正在构建一个更复杂的应用程序,它也有一个todo应用程序,这就是我的状态可能会是这样的:
{
otherState:'',evenMoreState:[]',evenMore:{},
todo:{ todos:[], completed:false, todoInput:''}
}
正如您所看到的,我现在将待办事项分离为一个单独的对象,因此它被封装且更有条理。所以我有两个问题。
1)这是个好主意吗?这似乎是合乎逻辑的举动,因为我的应用程序的大小会增长,我不希望所有的状态都作为主状态对象的属性浮动。我是否正确地解决了这个问题?
2)我的组合减速器(据我所知)不能采用嵌套对象。所以它现在看起来像这样。
combineReducers({ otherState,evenMoreState,evenMore,todo})
所以现在我的减速器组合必须在处理todo状态的reducer里面完成。是否有更好/不同的方法来做到这一点?
由于
答案 0 :(得分:2)
是的,你绝对是在正确的轨道上。同样值得注意的是,您可以多次使用combineReducers
,例如:
const rootReducer = combineReducers({
otherState : otherStateReducer,
todos : combineReducers({
todos : todosReducer,
completed : todosCompletedReducer,
todoInput : todoInputReducer
})
如果需要,可以单独定义整个todos
部分,并在顶级combineReducers
调用中导入和引用。
});
您可能需要阅读Redux docs section on "Structuring Reducers"以了解有关组织减速器逻辑的方法的更多信息,以及Redux FAQ on organizing nested state。此外,我Redux Techniques的Redux Architecture和React/Redux links list部分提供了有关构建真实Redux应用程序的各种文章的链接。