如何使用规范化数据正确管理状态

时间:2016-04-28 11:08:35

标签: reactjs redux

假设我正在为我的应用程序规范化数据,最终得到状态如下:

{ 
    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中管理它。 - 它使用这种方法更难组织代码。

有更好的选择吗?

1 个答案:

答案 0 :(得分:0)

一般建议的做法是使用“选择器”功能隐藏动作创建者和mapState函数中商店形状的状态。至于如何分割逻辑的问题,没有单一的答案 - 做任何更适合你的事情。

Redux常见问题解答涵盖了这个问题:http://redux.js.org/docs/FAQ.html#structure-business-logic

此外,为了处理规范化数据,我强烈推荐https://github.com/tommikaikkonen/redux-orm库,它在Redux商店中的规范化数据之上放置一个非常好的模型类型的外观,包括管理实体类型之间的关系。