Javascript 如何在react/redux中调用API并从另一个子级更新一个子级

Javascript 如何在react/redux中调用API并从另一个子级更新一个子级,javascript,reactjs,redux,react-redux,reselect,Javascript,Reactjs,Redux,React Redux,Reselect,我正在使用redux、react、react路由器和重新选择。有一个包含两个组件的屏幕,标题和正文。标题中有一个组件用于选择ID。当选择新ID时,将调度一个新操作以更新处于redux状态的ID 基于该ID,应该有一个异步API调用,从服务器加载元素并将其存储在状态中,然后触发屏幕渲染并在正文中显示元素。然后,将使用“重新选择”从状态中提取加载的元素 现实生活中的场景要比这复杂一些,因为有许多不同的Body组件具有不同的API调用,并且只有一个Header组件。但它们可以被视为不同的屏幕。例如:

我正在使用redux、react、react路由器和重新选择。有一个包含两个组件的屏幕,
标题
正文
标题中有一个组件用于选择ID。当选择新ID时,将调度一个新操作以更新处于redux状态的ID

基于该ID,应该有一个异步API调用,从服务器加载元素并将其存储在状态中,然后触发屏幕渲染并在
正文中显示元素。然后,将使用“重新选择”从状态中提取加载的元素

现实生活中的场景要比这复杂一些,因为有许多不同的
Body
组件具有不同的API调用,并且只有一个
Header
组件。但它们可以被视为不同的屏幕。例如:

屏幕1:

组件:
标题
车身类型A
;要调用的API:
apiA

屏幕2:

组件:
标题
车身类型B
;要调用的API:
apiB


我的理解是,当reducer在state中存储新ID时,应该在reducer中执行API调用。但是,如果操作是由跨屏幕共享的组件调度的,那么如何确定显示哪个屏幕以及调用哪个API呢?我是否可以在
正文中订阅ID更改并从屏幕内触发API调用?屏幕类型由react路由器决定。减速器是否可以访问路由器以确定显示的屏幕?有没有处理这种情况的最佳做法?

看来您可能想得太多了。所以,一次只做一件事:

我的理解是,当reducer在state中存储新ID时,应该在reducer中执行API调用

除非您使用允许从减速器返回操作的redux循环,否则您是错的。在主减速器中,减速器不能分派任何动作,它们只消耗这些动作。它是中间件层(或ActionCreator),您可以在其中分派操作并调用API

但是,如果操作是由跨屏幕共享的组件调度的,那么如何确定显示哪个屏幕以及调用哪个API呢

要确定“您在哪里”,最好将路由信息保存在状态树中。既然你正在使用Read路由器,那么无论如何要考虑在你的状态树中使用路由信息,然后从你的中间件/动作创建者/选择器中访问它。 我是否可以在主体中订阅对ID的更改,并从屏幕内触发API调用

是的,从技术上讲,你可以订阅商店的变化,但通常你不会有太多-看看我的其他观点,希望它足够清楚

屏幕类型由react路由器决定。减速器是否可以访问路由器以确定显示的屏幕

没有(通常)还原程序只能访问其状态片,因此,虽然还原程序可能会对react路由器操作作出反应(如果您使用react router redux,请参见上文),以存储您需要的路由详细信息,但原则上,应该由选择器和/或连接的组件从状态树中构造/提取给定组件所需的数据

是否有处理此类场景的最佳实践

我想使用react router redux,引入一个中间件,该中间件将触发API调用以响应您的操作,并将发送包含API返回的数据的连续操作。您将在reducer中处理的操作,将数据存储在树中


还有一个随机提示,如果你有bodyTypeA,bodyTypeB这样的组件,那么这些组件可以(甚至应该)保留a或B的信息,并将其传播给动作创建者。例如,如果您有一个名为requestForId(ID)的操作创建者,您将把签名修改为requestForId(ID,type),并且在组件/回调中(无论何时调用该操作创建者),您将不仅传递ID,而且传递类型,即bodyTypeA将使用requestForId(ID,'A')调用它。

是的,我写过应该在reducer中调用操作,但我的意思是在处理操作的代码中,但在分派之前。正如你所说的,中间件将是什么。谢谢你的两个建议,我会研究的。