vue-apollo调用refetch后onResult被触发两次是否正常?
调用useQuery的refetch方法时onResult触发两次是否属于预期行为?
这个情况属于Apollo Client的预期行为,具体原因如下:
当调用refetch方法时,Apollo Client会分两个阶段触发onResult:
- 首次触发:此时返回结果的
loading字段为true,数据是当前缓存中的旧数据(即便设置了network-only或no-cache,组件仍会先拿到之前的缓存数据作为过渡状态); - 二次触发:网络请求完成后,返回结果的
loading字段为false,数据是最新的网络返回内容。
你可以在onResult中打印data.loading来验证这个流程:
onResult(data => { console.log(data.loading, data); });
如果只想处理最终的有效数据,可以在onResult中添加判断,过滤掉loading状态的回调:
onResult(data => { if (!data.loading) { console.log(data); } });
另外,也可以在useQuery的配置项中设置notifyOnNetworkStatusChange: false,这样只有当数据实际更新时才会触发onResult,跳过loading状态的回调:
const { onResult, refetch } = useQuery(GQLendpoint, { ...options, notifyOnNetworkStatusChange: false });
内容的提问来源于stack exchange,提问作者Primery
相关产品推荐
相关产品推荐

