useLazyQuery调用refetch后data未更新问题求助
解决useLazyQuery refetch后数据不更新的问题
针对你遇到的useLazyQuery调用refetch后,getAllContactsData无法触发useEffect更新的问题,可从以下几个方向排查解决:
1. 确保refetch时传递正确的变量
调用refetchQuery时,必须传入与首次查询一致的变量参数(如果你的查询需要变量的话)。如果变量缺失或不匹配,Apollo可能返回旧数据或不触发新的请求:
// 示例:传入查询所需的变量 refetchQuery({ variables: { groupId: yourTargetGroupId } });
2. 显式指定refetch的fetch策略
虽然你已经设置了fetchPolicy: "no-cache",但refetch时可以显式指定更严格的策略确保拉取最新数据:
refetchQuery({ fetchPolicy: 'network-only' });
network-only会强制跳过缓存,直接从服务器获取数据,避免因缓存策略导致的数据不更新。
3. 改用onCompleted回调处理数据更新
把数据更新逻辑从useEffect移到useLazyQuery的onCompleted回调中,这个回调会在每次查询完成时执行(包括首次调用和refetch),无需依赖状态变化触发:
const [getAllContactsInGroup, { data: getAllContactsData, loading: loadingContactsData, refetch: refetchQuery },] = useLazyQuery(GET_ALL_CONTACTS_IN_GROUP, { client, fetchPolicy: "no-cache", notifyOnNetworkStatusChange: true, onCompleted: (data) => { if (data?.getAllContactsInGroup?.contacts) { setUserGroupData(data.getAllContactsInGroup.contacts); } } });
这种方式更直接,也能避免useEffect依赖项相关的问题。
4. 扩展useEffect的依赖范围
如果坚持使用useEffect,可以将loadingContactsData加入依赖数组。因为refetch时loadingContactsData会从false变为true再变回false,此时数据已完成更新,能触发useEffect执行:
useEffect(() => { console.log('getAllContactsData'); if (getAllContactsData) { console.log(getAllContactsData['getAllContactsInGroup']['contacts']) setUserGroupData(getAllContactsData['getAllContactsInGroup']['contacts']); } }, [getAllContactsData, loadingContactsData]);
5. 检查Apollo Client缓存配置
确认你的Apollo Client没有自定义的缓存拦截逻辑,或者查询返回的数据结构是否有变化,导致数据没有正确同步到getAllContactsData状态中。
内容的提问来源于stack exchange,提问作者Bilal Rabbi
相关产品推荐
相关产品推荐

