redux 规范化状态:byId 和 allIds 模式



我正在介绍用于构建应用程序状态的文档模式:

https://redux.js.org/recipes/structuring-reducers/normalizing-state-shape

在那里,人们看到了以下维护假设博客应用程序帖子的建议方法:

posts : {
byId : {
"post1" : {
id : "post1",
author : "user1",
body : "......",
comments : ["comment1", "comment2"]
},
"post2" : {
id : "post2",
author : "user2",
body : "......",
comments : ["comment3", "comment4", "comment5"]
}
},
allIds : ["post1", "post2"]
}

我完全不清楚在该州维护allIds字段有什么好处。以下数据结构是否不包含完全相同的信息?

posts : {
"post1" : {
id : "post1",
author : "user1",
body : "......",
comments : ["comment1", "comment2"]
},
"post2" : {
id : "post2",
author : "user2",
body : "......",
comments : ["comment3", "comment4", "comment5"]
}
}

在我看来,第一种方法(即官方建议的方法(具有冗余信息,通常被视为缺陷。我看到的第一种方法的唯一好处是,如果我们使用byId属性提前缓存一些帖子。我相信官方的 redux 文档有正当的理由来建议这种模式。我已经在一些 React 应用程序中使用了 Redux,但没有太复杂的东西,所以我一定显然没有看到一些东西。

allIds字段有几个好处:

  • 它为"所有 ID"提供了一致的数组引用,而像Object.keys(state.posts)每次都会创建一个新数组
  • 它可以充当所有项目的默认排序顺序,无论是基于广告顺序还是其他内容。

我们的官方 Redux 工具包包现在有一个新的createEntityAdapterAPI,它实现了管理这种规范化状态形状的逻辑,它以{ids: [], entities: {} }的形式组织。 它专门实现了将ids数组保持排序顺序的功能,并确保ids数组仅在添加、删除项目或排序顺序更改时更改。

您可能还想通读高级 Redux 实体规范化,其中进一步考虑了如何使用 ID 数组来指示过滤和排序顺序。

最新更新