如何调用API并在react / redux中更新来自另一个孩子的一个孩子

时间:2016-11-01 08:33:33

标签: javascript reactjs redux react-redux reselect

我正在使用redux,react,react-router和reselect。有一个屏幕包含两个组件,HeaderBodyHeader中有一个组件可以选择ID。选择新ID时,将调度新操作以更新redux中状态的ID。

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

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

屏幕1:

组件:HeaderBodyTypeA;要调用的API:apiA

屏幕2:

组件:HeaderBodyTypeB;要调用的API:apiB

我的理解是,在将新ID存储在状态时,应该在reducer中完成API调用。但是,如果跨屏幕共享的组件调度操作,如何确定显示哪个屏幕以及调用哪个API?我可以以某种方式在Body订阅更改ID并从屏幕内触发API调用吗?屏幕类型由react-router确定。减速器是否可以访问路由器以确定显示哪个屏幕?是否有处理此类情景的最佳做法?

1 个答案:

答案 0 :(得分:2)

好像你可能正在思考这个问题。所以,一次一件事:

  

我的理解是,在将新ID存储在状态时,应该在reducer中完成API调用。

除非您使用redux-loop,否则允许从reducer返回一个动作。在主要减速器中,不能发送任何动作,它们只消耗它们。它是您分派行动并可能调用您的API的中间件层(或动作创建者)。

  

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

要确定“你在哪里”,最好在状态树中保留路由信息。既然您正在使用react路由器,请考虑使用https://github.com/reactjs/react-router-redux在状态树中公开路由信息,然后从中间件/操作创建者/选择器访问它。

  

我可以以某种方式在Body中订阅更改ID并从屏幕内触发API调用吗?

是的,从技术上讲,您可以订阅商店更改,但通常情况下您也不会这样做 - 请参阅我的其他观点并希望它足够清楚。

  

屏幕类型由react-router决定。减速器是否可以访问路由器以确定显示哪个屏幕?

否(一般情况下)减速器只能访问它们的状态片段,因此虽然减速器可能会对路由器动作做出反应(如果您使用react-router-redux - 参见上文)来存储您需要的路由详细信息,但原则上应由您的选择器和/或连接组件来构造/从状态树中提取/提取给定组件所需的数据。

  

是否有处理此类情况的最佳做法?

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

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