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

如何在Apollo Client中按变量区分分页查询缓存?

问题描述

我在执行带分页参数的GraphQL查询,传入page和pageSize变量的代码如下:

const {data} = useQuery(PAGINATED_QUERY, {
    variables: {
        page: 1,
        pageSize: 10,
    }
});

切换到第二页时数据能正常更新,但切回第一页时,Apollo Client认为该查询已缓存(变量相同),却返回第二页的数据。推测是不同变量的查询写入了同一缓存空间。现有方案只有设置fetchPolicy: 'no-cache',不符合我的需求——我不想关闭缓存,但需要支持服务端分页查询。

解决方案

要让Apollo Client按变量分离缓存结果,有以下几种可行方案:

1. 配置keyArgs区分缓存条目

在初始化InMemoryCache时,通过typePolicy为分页查询字段指定keyArgs,将page和pageSize纳入缓存键的生成逻辑,让不同参数的查询对应不同缓存条目:

const cache = new InMemoryCache({
  typePolicies: {
    Query: {
      fields: {
        // 替换为你的实际分页查询字段名
        paginatedItems: {
          keyArgs: ['page', 'pageSize'],
          // 纯分页场景下直接返回新数据即可,无需合并
          merge(existing, incoming) {
            return incoming;
          },
        },
      },
    },
  },
});

2. 确保实体有唯一标识(辅助方案)

如果分页查询返回的是实体列表,确保每个实体包含唯一id(或自定义唯一字段),并通过dataIdFromObject让Apollo Client正确识别实体身份。这能避免实体级别的缓存混淆,配合keyArgs使用效果更稳定:

const cache = new InMemoryCache({
  dataIdFromObject: (object) => {
    return object.id || `${object.__typename}:${object.uniqueKey}`;
  },
});

3. 配合默认缓存策略使用

完成上述配置后,使用默认的cache-first策略即可,不同分页参数的查询会自动读取对应缓存数据,无需禁用缓存。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 05:38:17