我有一个React组件,看起来像这样:
function MyComponent(props) {
const dispatch = useDispatch(); // Redux dispatch function
const isLoading = useSelector(selIsLoading); // flag from our Redux app state
const data = useSelector(selData); // data from our Redux app state
useEffect(() => {
if (!data && !isLoading) {
console.log('Need to fetch!');
dispatch(actionToFetchStuff());
}
}, [data, isLoading]);
return !data ? <NoData /> : <Data data={data} ...props />;
}
问题是:当页面上有多个MyComponent
的示例同时加载时,useEffect
的闭包已经捕获了isLoading
和data
的 initial 值。这就是为什么所有组件都得出结论,它们需要同时获取对象。防止这种情况的isLoading
标志稍后出现,因为dispatch
(或者更确切地说,useEffect
的效果)是(伪)异步的。
我可以使用saga
,但我宁愿不使用,因为这是一个非常简单的组件,而传奇故事往往会使事情变得复杂。我正在寻找一种聪明的方法,使用React钩子或类似的东西,而不会使我的组件过于复杂。
1条答案
按热度按时间wribegjk1#
最后我实现了一个钩子来解决这个问题。我的组件变成了:
我这样实现了
useRemoteData
:它只是测量自上次提取以来的时间。如果时间短于某个最小延迟,它会推迟对shouldFetch
的调用。这也会使提取数据更有顺序性,这可能会导致总体加载时间略有增加,但我发现这不是一个大问题,两次提取之间的最大延迟为100ms。