Reactjs 如何在Redux应用程序中动态/任意创建其他还原程序或避免获取竞争条件

Reactjs 如何在Redux应用程序中动态/任意创建其他还原程序或避免获取竞争条件,reactjs,redux,react-redux,fetch-api,reducers,Reactjs,Redux,React Redux,Fetch Api,Reducers,更新 这里提供的Redux示例可能对其他人有指导意义: 更新 谢谢你的评论。我仍在对此进行调查,但我目前正在探索一种类似于@Chase DeAnda建议的方法。但是,我使用的不是数组,而是一个对象,其键等于父组件,值等于子组件的还原器。这种方法看似可行,但仍然是在制品。缺点是父组件的深度嵌套缩减器 这是Redux文档中讨论的模式: 上面的链接还讨论了在其他更好的设计模式中解决嵌套问题的方法。我使用此文档来获得我想要的结果 一旦我更进一步,我会用我的结果更新这个问题&也许我们会继续。希望结果


更新

这里提供的Redux示例可能对其他人有指导意义:


更新

谢谢你的评论。我仍在对此进行调查,但我目前正在探索一种类似于@Chase DeAnda建议的方法。但是,我使用的不是数组,而是一个对象,其键等于父组件,值等于子组件的还原器。这种方法看似可行,但仍然是在制品。缺点是父组件的深度嵌套缩减器

这是Redux文档中讨论的模式:

上面的链接还讨论了在其他更好的设计模式中解决嵌套问题的方法。我使用此文档来获得我想要的结果

一旦我更进一步,我会用我的结果更新这个问题&也许我们会继续。希望结果对其他类似情况的用户有用。再次感谢


原始问题

我找不到以下场景的设计建议,该场景正在使用获取请求创建竞争条件:

  • 有一些父组件可以由用户动态创建
  • 每个父级都有5个子级,它们都发出获取请求。这些孩子都有自己的减压器来促进这一点
  • 如果我在应用程序中创建一个新的父级,我需要创建新的子级缩减器,或者取消以前活动父级的所有飞行中请求,并为当前活动父级启动新请求
  • 有没有人遇到过类似的情况?我在这里阅读并尝试了Dan关于代码拆分的回复:

    但是上面描述的场景看起来不同。首先,我想根据一个非路由事件更改活动切片缩减器。在这种情况下,如果不违反设计原则,我无法访问商店。此外,即使我可以访问商店,我也不知道replaceReducer是否提供了我想要的行为

    我还回顾了丹·阿布拉莫夫的书呆子教程:

    事实上,我已经实施了他的解决方案,以避免儿童之间的种族状况。在父组件之间切换时会出现额外的复杂性级别

    我愿意接受任何建议。也可能是因为我的设计模式不适用,所以不介意为架构提供更好的解决方案

    TLDR

  • 对于页面上的给定路由,我有任意数量的父组件
  • 每个父组件都有特定数量的子组件,这些子组件都需要自己的还原程序来管理通过Fetch启动的req_sent、req_successed、req_failed(而不是xhr或其他具有良好支持的中止选项的选项)
  • 如果用户创建了更多的父组件(例如,针对不同的主题),则需要执行以下两种操作之一:
  • 将为新创建的父级的新创建的子级组件创建更多的子级缩减器并将其添加到存储中。或
  • 需要中止以前活动父级的所有正在运行的请求(同样是Fetch请求),并且新活动的父级组件允许新的子级请求发出并填充现有的子级缩减器

  • 否则,我最终会得到来自子约简器的竞争条件,其中填充了错误父组件的数据。

    如果一次只有一个活动父组件,您可以简单地将父组件的某种ID附加到每个单独的获取操作

    因此,如果已调度过时父组件的成功操作,例如:

    { type: 'CHILD_FETCH_SOMETHING_SUCCESS', payload: { parentID: 'someParent123', data: { ... }} }
    

    ..您将检查此时someParent123是否仍然是活动的父组件。如果没有,数据可以被丢弃,状态也不会改变。

    为什么不使用一个可以包含每个子实例数组的缩减器,而不是同一个缩减器的多个副本呢。。我觉得这是正确的方向。但让我再考虑一下。您的用例中是否有什么东西使redux成为比使用组件状态更好的选择?如果组件状态有效,并且每个组件都可以处理存储数据以及与获取其数据相关联的状态,可能会使生活更简单。是否确实需要动态创建新的还原器?您提到的这些子组件和父组件必须有共同之处。这意味着它们的行为只能在一个减速器中建模。如果新请求是由用户交互动态生成的,那么听起来您不应该在请求生命周期中使用redux状态。我将使用@TLadd指出的组件状态,只存储真正需要在redux中持久化的内容。谢谢您的评论。我仍在对此进行调查,但我目前正在探索一种类似于@Chase DeAnda建议的方法。但是,我使用的不是数组,而是一个对象,其键等于父组件,值等于子组件的还原器。这种方法看似可行,但仍然是在制品。缺点是父组件的深度嵌套缩减器。但我将探讨缓解这一问题的方法。一旦我更进一步,我会用我的结果更新这个问题&也许我们会继续。再次感谢!谢谢你的建议。我实际上正在实施这个解决方案的一部分。但是,发出这些请求,然后转储除当前活动的父级之外的所有请求是非常昂贵的。相反,我将它们作为key=parent/value=child对存储在状态树中。这样,用户可以启动几个不同的父组件,并在成功后将结果保存在状态中。