【发布时间】:2020-05-28 21:44:08
【问题描述】:
我有一些组件可以在一个页面中一起呈现或单独呈现,但它们需要相同的状态(订单信息),这是一个包含所有订单信息的对象。每个组件都使用该状态所需的数据。
我使用 redux 来管理状态,所以当我在一个组件中更新状态时,所有其他组件也可以读取此状态更改并更新。
问题是这个状态来自API,它的初始状态是一个未定义的对象:
const initialState = {
orderInfo: undefined,
};
这是因为它只有在客户浏览订单时才会显示其状态。因此,每当客户导航到/dashboard/orders/:id/ 时,组件都需要从 API 中获取数据。
我最初的想法是检查状态是否未定义或是否来自不同的订单 ID。如果是这样,则分派操作以从 API 中获取:
useEffect(() => {
// check if orderState contains order info and it's the same order
if (!orderState.orderInfo || orderState.orderInfo._id !== id) {
dispatch(getOrderInfo(id));
}
//eslint-disable-next-line
}, []);
这可行,但我必须对每个组件进行此检查,因为它们可以单独渲染。问题是当页面中有多个组件时,所有组件都会同时派发动作以从 API 中获取数据。
只有一个组件来调度操作的最佳方法是什么?
提前致谢!
【问题讨论】:
-
在
/dashboard/orders/:id处呈现的顶级组件是什么?这就是您应该对该路由进行初始提取调用的地方。 -
其中一种方法,您可以维护一个
State变量,该变量存储ApiCallsInProgress。当您进行第一次 API 调用时,increment这个状态变量由1提供。当收到response时,decrement由1或简单地在这种情况下将其设置为0。对于调度操作(任何组件)的任何后续 API 调用,请检查此ApiCallsInProgress是否为> 1。如果是,请跳过此 api 调用。希望这会有所帮助 -
@lawrence-witt 这只是一个包含组件的页面。此页面没有状态或任何逻辑。
-
@RohitKhanna 谢谢,我会考虑这个实现。但这是正确的方式吗?
标签: javascript reactjs redux react-redux redux-thunk