Apollo GraphQL表单提交后调用refetch不更新数据求助
解决Apollo refetch/mutation update后数据不更新的问题
确认refetch的变量准确性
调用accountDataRefetch时,务必保证传入的变量和初始查询一致。如果nrId在表单提交后有更新,手动传入最新变量避免使用旧值:await accountDataRefetch({ accountId: nrId });检查Apollo缓存的实体识别逻辑
Apollo靠__typename和实体主键(默认是id)匹配缓存中的数据。用Apollo DevTools查看缓存内的UserSocialLogin实体是否已更新:- 若实体主键不是
id,需要在Apollo Client配置中通过dataIdFromObject自定义主键规则,或者在GraphQL schema中用@key指令标记主键。 - 确保后端返回的更新结果包含正确的
__typename和主键字段,否则Apollo无法关联到缓存中的旧实体。
- 若实体主键不是
修正mutation的update方法逻辑
如果使用mutation的update手动更新缓存,要严格匹配查询的结构:const [updateSocialLogin] = useUpdateUserSocialLoginMutation({ update(cache, { data: updatedData }) { // 读取当前查询的缓存数据 const existingData = cache.readQuery({ query: GetUserSocialLoginQuery, variables: { accountId: nrId } }); // 合并更新后的数据,保持结构一致 cache.writeQuery({ query: GetUserSocialLoginQuery, variables: { accountId: nrId }, data: { getUserSocialLogin: { ...existingData.getUserSocialLogin, ...updatedData.updateUserSocialLogin } } }); } });注意嵌套字段要完全对齐,否则缓存更新不会触发UI重渲染。
强制从服务器拉取数据
调用refetch时指定network-only策略,绕过缓存直接请求最新数据:await accountDataRefetch({ fetchPolicy: 'network-only' });排查组件重渲染问题
如果accountData是嵌套对象,React可能因为引用未变化而不触发重渲染。可以解构出需要展示的字段作为组件依赖,或者用useMemo处理数据:const userSocialData = useMemo(() => accountData?.getUserSocialLogin, [accountData]);
内容的提问来源于stack exchange,提问作者Cătălin Avasiloaie
相关产品推荐
相关产品推荐

