You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Query调用invalidateQueries后未获取最新数据,求助排查

问题原因及解决方法

你的问题出在invalidateQueries的查询键匹配逻辑上:

  • useGetData的查询键是["data-item", id](带具体ID的数组),而你在useSetLike的onSuccess里调用invalidateQueries({ queryKey: ["data-item"] })时,默认是精确匹配查询键,只会命中键完全等于["data-item"]的查询,根本匹配不到带ID的目标查询,所以不会触发数据刷新。

切换到其他条目再返回能看到更新,是因为切换后原查询变为非活跃状态,返回时React Query会重新发起请求获取最新数据;而cacheTime:0没用是因为它控制的是非活跃查询的缓存保留时间,对活跃查询的刷新逻辑没有影响。

两种可行的修复方案

方案1:精确刷新当前点赞的条目(推荐)

利用mutation的variables参数(就是当前点赞的ID),构造精确匹配的查询键,只刷新对应条目,性能更优:

const useSetLike = () => {
  const queryClient = useQueryClient()

  return useMutation({
    mutationFn: (id: number) => {
      return setDataLike(id);
    },
    onSuccess: (data, variables) => {
      // variables就是当前点赞的id
      queryClient.invalidateQueries({ queryKey: ["data-item", variables] });
    },
  })
};

方案2:批量刷新所有data-item相关条目

如果需要一次性刷新所有ID的data-item查询,设置exact: false开启前缀匹配:

const useSetLike = () => {
  const queryClient = useQueryClient()

  return useMutation({
    mutationFn: (id: number) => {
      return setDataLike(id);
    },
    onSuccess: () => {
      queryClient.invalidateQueries({ 
        queryKey: ["data-item"], 
        exact: false // 开启前缀匹配,匹配所有以["data-item"]开头的查询键
      });
    },
  })
};

内容的提问来源于stack exchange,提问作者1110

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 03:37:42