构建 redux、redux-saga 和 normalizr

Structuring redux, redux-saga and normalizr

所以我想用这三种技术。我的想法是在 normalizr 的帮助下使用一个 reducer 来处理我所有的实体。

redux-saga 会监听 ENTITIES_REQUESTED 动作,运行 请求实体的 saga,并执行 ENTITIES_RECEIVED 动作,这将由调用 normalizr 的 reducer 处理并将实体存储在 entities 切片中。

要删除一个实体,必须发生两件事:实体必须从状态中删除,并且必须发生副作用,将实体从服务器中删除(旁注:我知道有些人会声称删除from state 是 也是 的副作用,但我认为 redux-saga 不符合这个概念。

所以我可以有一个 ENTITY_REMOVED 操作,它将实体从状态中移除,还有一个 saga 监听它,它将处理 api 调用。

现在假设我有一个 table,具有 table 的批量删除功能。 table 是接受动作 DATA_OPTIONS_SET 的减速器 "powered"。 reducer 会更新当前页面、过滤器等内容。还会有一个 saga 从听这个并调用 API 到 return 新数据集。

我想要批量删除功能,它在较高级别删除所有实体,完成后刷新 table。

如果我遍历要删除的实体,并发送一个 ENTITY_REMOVED 操作,我将无法知道这些删除何时完成,因此我可以刷新 table。

如果我手动调用删除实体的 saga,ENTITY_REMOVED 将永远不会被分派,因此实体不会从商店中删除。

这是否意味着我的架构不正确,我在某处走错了路?

我会按如下方式处理您的问题:create delete saga which

  1. 等待以实体 ID 作为参数的 ENTITIY_REMOVE_REQUEST 操作
  2. 调用适当的端点从服务器删除实体
  3. 如果 api 调用成功,则调度 ENTITY_REMOVED 操作将从状态中删除实体。

当然这不是唯一的选择,更多细节将取决于您的 api 是如何构建的。而不是在第 3 点手动删除每个实体。您可以分派一个操作,该操作将从服务器获取所有实体并使用新实体列表更新您的整个状态,或者您可以批量处理并传递需要在单个 [ 中删除的所有实体=24=]调用点2.