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

Apollo Client:查询新数据时能否保留之前的旧数据?

解决Apollo Client查询时保留旧数据的问题

要实现新查询加载时保留旧数据,核心是给useQuery添加keepPreviousData: true配置,再结合networkStatus判断加载状态,具体做法如下:

  1. 修改useQuery配置
    添加keepPreviousData: true参数,这会让Apollo在变量变化发起新查询时,暂时保留上一次的查询结果,直到新数据返回:

    const { loading, data, error, refetch, networkStatus } = useQuery<
      RectangleQuery,
      RectangleQueryVariables
    >(RECTANGLE, {
      variables: { input: rectInput },
      fetchPolicy: 'cache-and-network',
      keepPreviousData: true, // 关键配置:保留旧数据直到新数据加载完成
    });
    
  2. 正确判断加载状态
    添加keepPreviousData后,loading字段的行为会变化——新查询发起时它不会立刻变为true,此时要通过networkStatus来判断是否正在加载新数据:

    import { NetworkStatus } from '@apollo/client';
    
    // 判断是否正在加载新数据
    const isLoadingNewData = networkStatus !== NetworkStatus.ready;
    

    此时的状态流程会变成:

    • 发起新查询时:isLoadingNewData: true, data: [上一次的旧数据]
    • 新数据返回后:isLoadingNewData: false, data: [新数据]
  3. 补充说明
    你之前尝试的fetchPolicy主要控制数据的来源(缓存/网络),但无法控制变量变化时是否保留旧数据。keepPreviousData是Apollo专门为分页、地图视口切换这类场景设计的特性,刚好匹配你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 10:25:25