本页解释了如何在 Redux 应用程序中正确构建和规范化数据,以提高性能、简化数据管理并实现高效更新。规范化是管理 Redux store 中复杂关系数据的关键技术,尤其是在处理相互引用的项目集合时。
有关选择器和从状态派生数据的信息,请参阅选择器和记忆化。有关常见中间件模式的信息,请参阅中间件模式。
规范化是一种借鉴自数据库设计的技术,它以以下方式组织数据:
在 Redux 应用程序中,规范化状态有助于高效管理关系数据、避免重复并简化对单个项目的更新。
来源
规范化您的 Redux 状态具有多项显著优势:
如果没有规范化,处理关系数据的应用程序通常难以保持嵌套数据副本的同步,从而导致错误、性能问题和不必要的复杂性。
来源
适当规范化的 Redux 状态遵循以下原则:
例如,您将拥有:
这种结构使得查找特定实体、单独更新它们以及维护不同实体类型之间的关系变得简单明了。
来源
Redux Toolkit 提供了 createEntityAdapter,这是一个有助于实现规范化状态的实用工具,并包含用于常见操作的预构建 reducer 和 selector。
适配器提供了一种标准化方式来存储规范化数据:
ids 数组,包含所有实体 ID 并按所需顺序排列entities 对象,用于存储实体数据,其中 ID 作为键这会创建一个具有以下结构的状态:
适配器提供了用于更新规范化状态的 CRUD 方法
适配器还会生成选择器函数,用于从 store 中检索数据
这些选择器可以在组件中与 useSelector 一起使用
来源
在使用规范化状态的 Redux 应用程序中,数据流通常遵循以下模式:
来源
当从嵌套状态结构迁移到规范化结构时,您需要转换状态并更新组件逻辑。以下是转换的基本示例:
这种转换需要在您的代码库中进行更改,但会使应用程序更易于维护且性能更佳。
来源
处理规范化数据时,您通常需要派生重构实体之间关系的信息。使用记忆化选择器有助于优化此过程:
记忆化版本仅在 posts 或 userId 更改时重新计算,避免了不必要的重复计算。
selectById 选择器来源
createSelector 以避免不必要的重复计算来源
处理实体之间的关系时,可以使用几种模式:
请记住,在更新过程中可能需要在多个地方维护关系数据,以确保一致性。
来源
规范化 Redux 状态结构是一种最佳实践,可以显著提高应用程序的可维护性和性能。通过将每种类型的数据存储在自己的“表”中并使用引用而不是嵌套,您可以创建更高效、更一致且更易于更新的状态结构。
Redux Toolkit 的 createEntityAdapter 提供了一种实现规范化状态的标准化方法,其中包含用于处理常见操作的内置 reducer 和选择器。
正确实施后,规范化状态将使您的 Redux 应用程序更具可伸缩性、更易于调试,并能更好地处理复杂的数据关系。
来源