在React Redux应用程序中规范化状态的示例是什么?

man*_*ain 7 state reactjs redux react-redux

我正在阅读Redux Reducers 文档并且没有了解状态正常化的方式.示例中的当前状态是:

{
  visibilityFilter: 'SHOW_ALL',
  todos: [
    {
      text: 'Consider using Redux',
      completed: true,
    },
    {
      text: 'Keep all state in a single tree',
      completed: false
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

如果我们按照下面的说法,您能举例说明上述情况吗?

例如,在一个真实的应用程序中保持todosById:{id - > todo}和todos:array在状态中是一个更好的主意,但我们保持示例简单.

Mih*_*hir 5

这个例子直接来自Normalizr

[{
  id: 1,
  title: 'Some Article',
  author: {
    id: 1,
    name: 'Dan'
  }
}, {
  id: 2,
  title: 'Other Article',
  author: {
    id: 1,
    name: 'Dan'
  }
}]
Run Code Online (Sandbox Code Playgroud)

可以这样标准化-

{
  result: [1, 2],
  entities: {
    articles: {
      1: {
        id: 1,
        title: 'Some Article',
        author: 1
      },
      2: {
        id: 2,
        title: 'Other Article',
        author: 1
      }
    },
    users: {
      1: {
        id: 1,
        name: 'Dan'
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

标准化有什么好处?

您可以提取您想要的状态树的确切部分。

例如 - 您有一个包含文章信息的对象数组。如果要从该数组中选择特定对象,则必须遍历整个数组。最坏的情况是数组中不存在所需的对象。为了克服这个问题,我们对数据进行了标准化。

要规范化数据,请将每个对象的唯一标识符存储在单独的数组中。让我们将该数组称为results.

result: [1, 2, 3 ..]

并将对象数组转换为具有键的对象id(参见第二个片段)。将该对象称为entities.

最终,要使用id1访问对象,只需执行以下操作- entities.articles["1"]

  • @mangocaptain 如果用户希望从 UI 中删除某些元素,只需从 `results` 数组中删除这些元素。这将触发 React 中的重新渲染。在重新渲染时,`results.map(id => entity.articles[id‌ ])` 将生成更新后的数据。原谅我,如果我对你没有任何意义。但是如果你使用 React+Redux 构建一些示例项目,你会更好地理解。 (2认同)