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
相关产品推荐
相关产品推荐

