转换实体/规范化响应
Transform entity / normalized response
我想知道在我的 Redux 状态中设置之前转换响应实体的好地方。
例子
- 我有一个
chat_message
实体
- 服务器发送了一个
read
布尔值属性
- 我需要计算一个新的
unread
布尔值 属性 = !message.read && message.user_id !== currentUser.id
问题
- 我是否在
getChatMessages
选择器 (reselect
) 中计算这个新属性?
- 在我的状态下设置规范化响应之前,我是否计算这个新属性? – 因此我的问题 "Transform"
- 我只是在我的
Component
中计算它吗,但是这个(简单的)逻辑并没有在各处共享和复制...
- 我是否从服务器发送
unread
属性...
备注
unread
属性示例是一个简化示例。
- 我不喜欢解决方案 1,因为您无论如何都需要在选择器之间共享此逻辑。所以你可能有一个由
getLastChatMessage
、getChatMessages
选择器共享的 isMessageUnread
辅助函数。我也不喜欢选择器做太多逻辑。
- 我倾向于解决方案 2。新的
unread
属性仅在收到响应时计算。
- 解决方案 3. 是我目前懒惰的解决方案(在这里和那里进行了实验,但没有真正的结论)
- 我不喜欢解决方案 4.,这些属性与 UI 相关而不是与后端相关。
- 如果使用解决方案 2.,我觉得
reducers
不是进行此转换的好地方。对于简单的实体来说可能很容易,但是 "heavy" 转换(遍历集合、检查关系等)呢?我更愿意将新逻辑放在:选择器、缩减器和实体之外。有点像 normalizr "plugin" / interceptor / transformer / post-processor...
解决方案取决于属性的使用方式:
unread
属性是否特定于一个组件以用于其渲染目的,而不用于其他任何地方。例如:通知点。如果是,那么您可以使用解决方案 3,因为您可以在组件内本地化使用。
如果 unread
属性需要跨组件/中间件共享,将逻辑放在选择器/缩减器中是可行的方法。但是,如果您放置在减速器中,请询问是否所有订阅 chatBox
实体的组件都需要 unread
。如果不是,那么最好将它放在一个选择器中,它只能由那些需要它的组件/中间件调用。有一个额外的运行时计算的权衡,但它提供了适当的关注点分离,因为如果将来有更多这样的派生属性,这最终会受益。
Normalizr 提供 processStrategy
option:
Strategy to use when pre-processing the entity. Use this method to add
extra data, defaults, and/or completely change the entity before
normalization is complete.
我想知道在我的 Redux 状态中设置之前转换响应实体的好地方。
例子
- 我有一个
chat_message
实体 - 服务器发送了一个
read
布尔值属性 - 我需要计算一个新的
unread
布尔值 属性 =!message.read && message.user_id !== currentUser.id
问题
- 我是否在
getChatMessages
选择器 (reselect
) 中计算这个新属性? - 在我的状态下设置规范化响应之前,我是否计算这个新属性? – 因此我的问题 "Transform"
- 我只是在我的
Component
中计算它吗,但是这个(简单的)逻辑并没有在各处共享和复制... - 我是否从服务器发送
unread
属性...
备注
unread
属性示例是一个简化示例。- 我不喜欢解决方案 1,因为您无论如何都需要在选择器之间共享此逻辑。所以你可能有一个由
getLastChatMessage
、getChatMessages
选择器共享的isMessageUnread
辅助函数。我也不喜欢选择器做太多逻辑。 - 我倾向于解决方案 2。新的
unread
属性仅在收到响应时计算。 - 解决方案 3. 是我目前懒惰的解决方案(在这里和那里进行了实验,但没有真正的结论)
- 我不喜欢解决方案 4.,这些属性与 UI 相关而不是与后端相关。
- 如果使用解决方案 2.,我觉得
reducers
不是进行此转换的好地方。对于简单的实体来说可能很容易,但是 "heavy" 转换(遍历集合、检查关系等)呢?我更愿意将新逻辑放在:选择器、缩减器和实体之外。有点像 normalizr "plugin" / interceptor / transformer / post-processor...
解决方案取决于属性的使用方式:
unread
属性是否特定于一个组件以用于其渲染目的,而不用于其他任何地方。例如:通知点。如果是,那么您可以使用解决方案 3,因为您可以在组件内本地化使用。如果
unread
属性需要跨组件/中间件共享,将逻辑放在选择器/缩减器中是可行的方法。但是,如果您放置在减速器中,请询问是否所有订阅chatBox
实体的组件都需要unread
。如果不是,那么最好将它放在一个选择器中,它只能由那些需要它的组件/中间件调用。有一个额外的运行时计算的权衡,但它提供了适当的关注点分离,因为如果将来有更多这样的派生属性,这最终会受益。
Normalizr 提供 processStrategy
option:
Strategy to use when pre-processing the entity. Use this method to add extra data, defaults, and/or completely change the entity before normalization is complete.