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

Tanstack Query问题:相同查询键导致第二个查询未执行

问题原因

React Query 是通过 queryKey 唯一识别每个查询的,你这两个 Hook 用了完全相同的 ['story', userId] 作为 queryKey,React Query 会判定这是同一个查询任务。当第一个查询在执行或已有缓存时,第二个查询会被直接忽略,自然就出现了阻塞情况。

解决方案

给两个查询的 queryKey 加上专属标识,让它们能被精准区分:

  • 针对 useGetUserStories,在 queryKey 中加入 'user' 标识,明确这是获取当前用户的故事:
export const useGetUserStories = (userId?: string | null) => {
  return useQuery({
    queryKey: ['story', 'user', userId], // 加入'user'做区分
    queryFn: async () => {
      const stories = await axios.get(`${API_URL}/story/${userId}`);
      return stories.data;
    },
    enabled: !!userId,
  });
};
  • 针对 useFetchFeedStories,加入 'feed' 标识,同时注意无限查询的参数传递逻辑(原写法中 page 参数无法被 queryFn 正确接收):
export const useFetchFeedStories = (userId?: string) => {
  return useInfiniteQuery({
    queryKey: ['story', 'feed', userId], // 加入'feed'做区分
    queryFn: async ({ pageParam = 1 }) => { // 用pageParam接收分页参数
      const stories = await axios.get(
        `${API_URL}/story/feed/${userId}/${pageParam}`
      );
      return stories.data;
    },
    getNextPageParam: (lastPage) => {
      // 根据后端返回的内容判断是否有下一页,示例逻辑:
      return lastPage.hasMore ? lastPage.nextPage : null;
    },
    enabled: !!userId,
  });
};
额外说明

queryKey 的核心作用就是区分不同查询场景,只要保证每个独特的查询逻辑对应唯一的 queryKey,就不会出现这类阻塞问题。之前移除 userId 后能正常执行,只是因为两个 queryKey 变成了相同的 ['story'],但这会导致不同用户的查询共用缓存,显然不符合业务需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 14:42:53