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

Apollo Client useQuery获取数据成功后未触发组件重渲染的问题求助

Apollo Client useQuery获取数据成功后未触发组件重渲染的问题求助

大家好,我最近在开发Next.js应用时碰到了一个特别棘手的问题,想请教下社区里有没有朋友遇到过或者能给出解决方案:

我的技术栈环境

  • 框架:Next.js
  • 数据服务:PostGraphile GraphQL服务器
  • 客户端工具:用graphql-codegen生成Apollo Client的自定义hooks

问题现象

我用生成的usePrimaryRunsQuery发起请求后,浏览器的网络面板明明显示数据已经成功从服务器返回了,但hook的状态一直卡在{data: undefined, error: undefined, loading: true},完全不会触发组件重渲染来展示数据。

更奇怪的是,只要我随便保存一个项目文件触发热重载,这个hook就会立刻更新状态,变成{data: some_data, error: undefined, loading: false},数据也能正常渲染出来。

我已经尝试过的解决方案(都没用)

  • 换过好几个不同版本的Apollo Client,还是一样的问题
  • 甚至去调试node_modules里的Apollo源码,也没找到问题所在
  • 试过把fetchPolicy设置成cache-first、network-first、cache-and-network这几种,都没有效果

目前唯一可行但不优雅的办法

我发现如果把这个useQuery hook放到一个Provider组件里面调用,就能正常触发重渲染拿到数据,但我完全搞不懂为什么这样就能解决问题,而且这个方案感觉不够干净,不是最优解。

我猜测这个问题可能和Apollo的缓存机制有关,但实在找不到具体的问题点。有没有朋友遇到过类似的情况?或者能提供更合理的解决方案?

相关代码片段

useQuery调用代码

const { data: primaryRunsData, loading } = usePrimaryRunsQuery();

对应的GraphQL查询

query PrimaryRuns(
  $first: Int = 10
  $filter: ShellRunFilter = {
    run: { id: { equalTo: "4acf2d7c-9a70-42f6-9fb7-bd7cb9e3c182" } }
  }
) {
  shellRuns(
    first: $first
    filter: $filter
    orderBy: MULTILATERAL_TRADE_POPULATIONS_PREPARATION_BY_RUN_ID__EXECUTION_TIME_ASC
  ) {
    nodes {
      run {
        ...ShellRunData
      }
      shell {
        name
        shellRunsList(filter: { executionCandidate: { equalTo: false } }) {
          run {
            ...ShellRunData
          }
        }
      }
    }
    totalCount
  }
}

备注:内容来源于stack exchange,提问作者Itay Tur

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.22 15:49:34