规范化 - 我将在哪里修改实体?



所以我跑在前面,规范化了化简器中的所有实体,这意味着每个化简器都有一个单独的entities对象。我现在意识到一个化简器将所有实体都包含在其中,然后只是将 ID(例如当前用户或其他东西(存储在单独的化简器中更有意义。

这种方法对于从 API 响应合并实体完全有意义,但我无法弄清楚如何更改任何实体。

例如,我将在哪里执行这样的操作?

case SUBSCRIBER_TOGGLED: {
let projectSubscriberIDs = cloneDeep(action.payload.project.subscriberIDs);
let indexIfExists = projectSubscriberIDs.indexOf(action.payload.user.id);
if(indexIfExists != -1){
projectSubscriberIDs.splice(indexIfExists, 1);
}else{
projectSubscriberIDs.push(action.payload.user.id);
}
return {
...state,
entities: {
...state.entities,
projects: {
...state.entities.projects,
[action.payload.project.id]: {
...action.payload.project,
subscriberIDs: projectSubscriberIDs
}
}
}
}
}
  • 我们无法在操作中更早地解决这个问题,因为操作无法知道处于状态
  • 我们不能在不包含相关实体的化简器中执行此操作,因为化简器不能/不应该访问其他化简器
  • entities减速器中做所有这些感觉不对,因为它会变得一团糟

有人在这里有任何见解吗?

一些想法:

  • 操作创建者可以知道处于状态的内容,因为redux-thunk允许您编写有权访问getState()的函数。
  • 根据有关在切片缩减器之间共享状态的 Redux 常见问题条目,切片缩减器可以访问其他状态切片中的数据。
  • 除了 Normalizr 之外,还有很多其他选项可用于管理 Redux 中的规范化状态。 我个人是 Redux-ORM 库的粉丝,在我的"实用 Redux"教程系列中对此进行了广泛的介绍。
  • 在该系列中,我专门展示了一种编写"功能化简器"的方法,该方法可以访问整个根状态树,以及用于根据其类型和 ID 更新任何实体的通用逻辑。
  • 最后,您可能还需要查看immer不可变更新库,以简化嵌套状态的更新。

最新更新