假设我正在为我的应用程序规范化数据,最终得到状态如下:
{
entities: { profiles: { 1: {...}, ...}, roles: {...}, ... },
profileList: [1, 2, 3],
roleList: [1, 2, 3],
profile: [2],
...
}
现在,假设我有一个配置文件列表视图,其中列出了所有配置文件。如果我添加新配置文件,我希望更改立即反映在用户界面中,因此我需要处理ADD_PROFILE
缩减器中的profileList
操作,以及正确的部分州内entities
。
如何管理这些变更的最佳做法是什么?
一方面,我可以创建胖动作和简单的实体缩减器,它只是将动作响应合并到实体中。我喜欢这个,因为我只关注非实体的缩减器。我不喜欢这个,因为这似乎我的行动和我的减速器都依赖于关于国家看起来的知识。
另一方面,我可以创建单独的reducer并将它们组合起来:
const reducer = combineReducers({
entities: combineReducers({
profiles,
roles
}),
profileList,
roleList,
profile,
});
我喜欢这个,因为我知道只有减速器知道状态的形状。我不喜欢它,因为它让我的生活更加艰难:
- 添加新配置文件时,我必须在profiles
reducer和profileList
reducer中管理它。
- 它使用这种方法更难组织代码。
有更好的选择吗?
答案 0 :(得分:0)
一般建议的做法是使用“选择器”功能隐藏动作创建者和mapState
函数中商店形状的状态。至于如何分割逻辑的问题,没有单一的答案 - 做任何更适合你的事情。
Redux常见问题解答涵盖了这个问题:http://redux.js.org/docs/FAQ.html#structure-business-logic
此外,为了处理规范化数据,我强烈推荐https://github.com/tommikaikkonen/redux-orm库,它在Redux商店中的规范化数据之上放置一个非常好的模型类型的外观,包括管理实体类型之间的关系。