如何在大型规范化 Redux 存储中组织化简器



我已经阅读了Redux网站上的官方文档,一些在线文章和StackOverflow上关于这个主题的一些问题,但我仍然不知道如何组织我的状态。

我当时规范化是因为某些实体具有对同一对象的引用,处理这个问题会变得有问题。

所以,在规范化之后,这是我的状态:

state: {
measurementSystems: { 0: {}, 1: {} },
measurementUnits: { 0: {}, 1: {} },
sameTypeUnitConverters: { 0: {}, 1: {} },
bodyMeasurementTypes: { 0: {}, 1: {} },
bodyMeasurements: { 0: {}, 1: {} },
bodyMeasurementShortcutSettings: { 0: {}, 1: {} },
uniqueBodyMeasurements: { 0: {}, 1: {} },
nutritionalTables: { 0: {}, 1: {} },
dataSources: { 0: {}, 1: {} },
foodGroups: { 0: {}, 1: {} },
foods: { 0: {}, 1: {} },
diaryEntries: { 0: {}, 1: {} },
mealSettings: { 0: {}, 1: {} },
goals: { 0: {}, 1: {} },
users: { 0: {}, 1: {} }
};

我的问题是:如何为这种规范化状态编写化简器?我应该为每个状态编写一个化简器,然后处理相同的操作吗?还是我应该为每个操作创建一个化简器并使该化简器管理所有状态?

例如,如果我每个状态都有一个化简器并发送一个操作REMOVE_DIARY_ENTRY。我将不得不使所有在日记条目中具有引用的状态来处理此操作并检查它们是否需要删除已删除的引用。但是我将如何进行这些检查?

否则,如果我每个操作有一个化简器,这些化简器可以开始执行非常相似的任务,并与当前状态架构非常耦合。

这部分只是为了澄清

以下是它们的意思(这是一个跟踪你吃什么的应用程序(:

  • 日记条目代表日记中的食物;食物位于具有数据源的食品组中食物也有营养表测量单位;
  • 测量系统,测量单位和
  • 相同类型单位转换器用于存储厘米,米和磅等测量的精确信息。
  • BodyMeasurementTypes,bodyMeasurements和uniqueBodyMeasurements用于跟踪用户的测量值,例如胸部尺寸。
  • 膳食设置和身体测量快捷方式设置是应用程序 UI 的设置。

我建议首先考虑将哪些操作调度到存储以及如何使用商店信息。这使您可以决定如何更好地拆分商店。

  1. 可以从想要显示和修改存储以响应用户迭代的组件中调度和存储操作。例如,您可能有表或列表向用户显示日记条目,另一个 - 显示身体测量。用户可能想要设置身体测量或添加日记条目。因此,您可以考虑将日记条目、食物和相关实体分组在商店的一个部分,将身体测量分组在另一个部分。(这可以是基于 React 组件如何使用数据的逻辑划分(

  2. 用户可能无法修改测量系统和测量单位(它们可能由管理员设置或预加载到数据库中(。因此,它们可以被视为目录并放在名为Catalogs的商店的单独部分。它们可以通过REQUEST_CATALOGSRECEIVE_CATALOGS操作从后端加载,并在应用程序中保持只读。

  3. 用户列表可以是商店的第三部分,例如,如果它可以由应用程序的管理员修改。或者它可以与其他部分分开

  4. 目标也可以是应用商店的独立部分,因为它们可以显示在应用的其他部分(而不是显示日记条目正文测量的部分(。并且可能允许用户设置他/她的目标。因此,最好将目标放在首位。

另一种方法是考虑如何从后端获取实体并保存回来。如果最好一次获取所有实体,您可以将所有实体保留在商店的一部分中。可能仅将只读实体与可写实体分开。并具有像CHANGE_ENTITY这样的通用动作,它将携带有效载荷entityTypeentityType将是diaryEntriesbodyMeasurements或用户想要修改的任何其他内容。

例如

{ type: 'CHANGE_ENTITY', entityType: 'diaryEntries', key: 0, value: 'some value' }

使用这种方法,所有存储都可以是整体式的。

最新更新