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

React+GraphQL+Apollo服务端分页:如何仅渲染当前页数据

Apollo服务端分页表格:解决翻页数据追加问题

问题根源

Apollo Client默认对数组类型的查询结果执行合并追加逻辑,当你切换页码时,新请求的数据会被合并到同名字段的缓存中,导致表格渲染所有合并后的数据。

解决方法:自定义缓存策略区分分页条目

通过配置Apollo Client的缓存规则,让不同页码、排序条件的查询结果单独存储,避免合并。

1. 配置Apollo Client的typePolicies

在创建Apollo Client实例时,为你的查询字段设置缓存区分规则:

import { ApolloClient, InMemoryCache } from '@apollo/client';

const client = new ApolloClient({
  uri: '你的GraphQL接口地址',
  cache: new InMemoryCache({
    typePolicies: {
      Query: {
        fields: {
          // 替换成你实际的查询字段名(对应Document中的查询字段)
          getYourData: {
            // 指定用来区分不同缓存条目的变量:ID、页码、排序字段、排序方向
            keyArgs: ['id', 'input.page', 'input.sort', 'input.order'],
            // 直接用新数据替换旧数据,不执行合并
            merge(existing, incoming) {
              return incoming;
            },
          },
        },
      },
    },
  }),
});

2. 修正查询变量的语法错误

你的代码中variables里的id,,存在语法错误,修正后确保分页变量正确传递:

const { data } = useQuery(Document, {
  variables: {
    id: 你的实际ID值, // 移除多余逗号
    input: {
      count: 25,
      page: page + 1,
      sort: sortField,
      order: sortOrder,
    },
  },
  notifyOnNetworkStatusChange: true,
  fetchPolicy: 'cache-first', // 保留该策略,回退到已加载页面时直接读取缓存
});

预期效果

  • 切换分页时,表格仅渲染当前页的新数据,不会追加到现有数据之后;
  • 回退到之前加载过的页面时,Apollo会直接从缓存读取该页的原始数据,无需重新发起网络请求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 13:32:44