0

我已经阅读了 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。我将必须让所有在 diaryEntry 中有引用的状态来处理此操作并检查它们是否需要删除已删除的引用。但是我将如何进行这些检查?

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

这部分只是为了澄清

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

  • diaryEntry代表日记中的食物食物位于具有数据源的foodGroup一个食物也有一个NutritionTable和一个measureUnit
  • MeasurementSystemsmeasurementUnitssameTypeUnitConverter用于存储精确的度量信息,例如厘米、米和磅。
  • BodyMeasurementTypesbodyMeasurementsuniqueBodyMeasurements用于跟踪用户测量值,例如胸部尺寸。
  • MealSettingsbodyMeasurementShortcutSettings是应用程序 UI 的设置。
4

1 回答 1

1

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

  1. 可以从想要显示和修改存储以响应用户迭代的组件中分派操作和存储消耗。例如,您可能有表格或列表来向用户显示diaryEntries和另一个 - 显示bodyMeasurements。并且用户可能想要设置bodyMeasurements或添加diaryEntry。因此,您可以考虑将diaryEntriesfood和相关实体分组到 store 的一个部分,而bodyMeasurements在另一个部分。(这可以是基于 React 组件如何使用数据的逻辑划分)

  2. MeasurementSystemsmeasurementUnits可能无法由用户修改(它们可以由管理员设置或预加载在数据库中)。所以它们可以被认为是目录并放在名为 的商店的单独部分中Catalogs。它们可以从后端加载REQUEST_CATALOGSRECEIVE_CATALOGS操作,并在应用程序中保持只读状态。

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

  4. 目标也可以是商店的独立部分,因为它们可以显示在应用程序的其他部分(不是显示diaryEntriesbodyMeasurements的部分)。并且可以允许用户设置他/她的目标。所以最好把目标放在第四部分。

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

例如

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

使用这种方法,所有商店都可以是单片的。

于 2019-12-07T09:51:03.070 回答