【问题标题】:Transform entity / normalized response转换实体/标准化响应
【发布时间】:2019-04-27 17:30:09
【问题描述】:

我想知道在将响应实体设置为我的 Redux 状态之前转换响应实体的好地方在哪里。

示例

  • 我有一个chat_message 实体
  • 它有一个由服务器发送的read布尔属性
  • 我需要计算一个新的 unread 布尔属性 = !message.read && message.user_id !== currentUser.id

问题

  1. 我是否在 getChatMessages 选择器 (reselect) 中计算这个新属性?
  2. 在我的状态设置标准化响应之前,我是否计算这个新属性? – 因此我的问题是“变换”
  3. 我只是在我的Component 中计算它,但是这个(简单)逻辑不会在所有地方共享和复制...
  4. 我是否从服务器发送unread 属性...

备注

  • unread 属性示例是一个简化示例。
  • 我不喜欢解决方案 1,因为无论如何您都需要在选择器之间共享此逻辑。所以你可能有一个由getLastChatMessage、getChatMessages 选择器共享的isMessageUnread 辅助函数。我也不喜欢选择器做太多逻辑。
  • 我倾向于解决方案 2。新的 unread 属性仅在接收响应时计算。
  • 解决方案 3. 是我目前的惰性解决方案(到处都有实验,但没有任何结论)
  • 我不喜欢解决方案 4。这些属性与 UI 相关,而不是与后端相关。
  • 如果使用解决方案 2,我觉得 reducers 不是进行此转换的好地方。对于简单的实体来说可能很容易,但是“重”转换(迭代集合、检查关系等)呢?我更愿意把这个新逻辑放在:选择器、reducers 和实体之外。有点像 normalizr“插件”/拦截器/变压器/后处理器...

【问题讨论】:

    标签: redux reselect normalizr


    【解决方案1】:

    Normalizr 提供processStrategy option:

    预处理实体时使用的策略。使用此方法添加 额外数据、默认值和/或之前完全更改实体 标准化完成。

    【讨论】:

      【解决方案2】:

      解决方案取决于属性的使用方式:

      • unread 属性是特定于单个组件的渲染目的,并且未在其他任何地方使用。例如:通知点。如果是,那么您可以使用解决方案 3,因为您可以在组件内本地化使用。

      • 如果unread属性需要跨组件/中间件共享,将逻辑放在选择器/reducer中是可行的。但是,如果您要放置在减速器中,请询问订阅chatBox 实体的所有组件是否需要unread。如果没有,那么最好将它放在一个选择器中,它只能由那些需要它的组件/中间件调用。需要权衡额外的运行时计算,但它提供了适当的关注点分离,因为如果将来有更多此类派生属性,这最终会受益。

      【讨论】:

      • 关于在选择器中更好地分离关注点的公平点。 unread 可能并非所有需要 chat_message 实体的组件都需要。虽然我仍然认为解决方案 2. 保持精简(更少的代码 - 更少的特定选择器,设置 unread 一次,在任何地方使用它(或不使用))
      • 是的。如果它只是几个这样的派生属性,那是有道理的。但是随着应用程序的增长,如果不同组件有更多这样的属性,将它们存储在状态中将是低效的。根据情况要求接听电话。您可以采用当前的方法,以后再进行折射。
      猜你喜欢
      • 2020-01-09
      • 2021-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-04
      • 2017-06-29
      • 2015-07-11
      相关资源
      最近更新 更多