如何在第一次挂载时使用 apollo 客户端在 react js 中多次调用相同的查询
Posted
技术标签:
【中文标题】如何在第一次挂载时使用 apollo 客户端在 react js 中多次调用相同的查询【英文标题】:How to call same query multiple times using apollo client in react js on first mount 【发布时间】:2021-09-17 17:10:35 【问题描述】:我需要在组件挂载时调用状态变化查询。 假设我在数组中有 5 个状态,我正在循环该数组。
预期的输出应该是:该查询必须被调用 5 次。
但问题是只调用了一次查询数组中最后位置的状态。
const loadedStatus = ["A", "B", "C", "D", "E"]
const [listSomeData] = useLazyQuery(LIST_SOME_DATA,
fetchPolicy: 'network-only'
);
const listSomeDataHandler = async (statusId, pagination = , filters = ) =>
await listSomeData(
variables:
statusId,
page: pagination?.page,
pageSize: pagination?.pageSize,
...filters
);
;
useEffect(async () =>
loadedStatus &&
Promise.all(
loadedStatus.map(status =>
listSomeDataHandler(
status.id,
page: 0, pageSize: 10 ,
filters
);
)
);
,[loadedStatus]);
【问题讨论】:
你能分享一些代码吗?从现在开始你做了什么? @GiovanniEsposito 我添加了一些代码。请看一下 【参考方案1】:useEffect
中的异步应被视为反模式(here 是一种解释),您应该收到类似 Warning: An Effect function must not return anything besides a function, which is used for clean-up.
的警告。
不仅您的 useEffect
缺少依赖项:listSomeDataHandler
。
在这种情况下,最好在useEffect
中调用异步函数(并将listSomeDataHandler
移动到useEffect
中)。所以你的代码变成了:
useEffect(() =>
const listSomeDataHandler = async (status) =>
await listSomeData(status);
;
(async () =>
Promise.all(
loadedStatus.map((status) =>
return listSomeDataHandler(status);
)
);
)();
, [loadedStatus]);
Here 我做了一个codeandbox 示例,如您所见,listSomeDataHandler
将被调用 5 次。
【讨论】:
感谢您的回复。一切正常,但是当您在处理程序中实现 apollo 客户端查询时,只会调用一次该查询。这里 listSomeData 是一个 graphql 客户端查询。以上是关于如何在第一次挂载时使用 apollo 客户端在 react js 中多次调用相同的查询的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Apollo 客户端 useQuery 钩子防止不必要的重新获取?
如何在 React Apollo 2.0 中正确地重新获取和缓存更新的数据?
仅在 React 组件挂载上运行 Apollo 查询(没有 queryData 和生命周期)
将 Apollo 客户端用于 GraphQl 时如何在 watchQuery 中使用 loading 属性