Apollo 3 分页与字段策略

2024-04-04

有人可以提供使用 Apollo Client 3.0 字段策略实现分页的示例吗?我一直在遵循文档中的示例来实现无限滚动,但在我的控制台中我收到以下警告:

The updateQuery callback for fetchMore is deprecated, and will be removed
in the next major version of Apollo Client.

Please convert updateQuery functions to field policies with appropriate
read and merge functions, or use/adapt a helper function (such as
concatPagination, offsetLimitPagination, or relayStylePagination) from
@apollo/client/utilities.

The field policy system handles pagination more effectively than a
hand-written updateQuery function, and you only need to define the policy
once, rather than every time you call fetchMore.

我对 Apollo 相当陌生,我真的不知道如何以 3.0 的方式做到这一点。我希望能举一些例子来更好地理解。

这是我当前的代码:

import React from "react";
import { useGetUsersQuery } from "./generated/graphql";
import { Waypoint } from "react-waypoint";

const App = () => {
  const { data, loading, error, fetchMore } = useGetUsersQuery({
    variables: { limit: 20, offset: 0 },
  });

  if (loading) return <div>Loading...</div>;
  if (error) return <div>Error</div>;

  return (
    <div className="App">
      {data && data.users && (
        <div>
          {data.users.map((user, i) => {
            return (
              <div key={i} style={{ margin: "20px 0" }}>
                <div>{user.id}</div>
                <div>{user.name}</div>
              </div>
            );
          })}
          <Waypoint
            onEnter={() => {
              fetchMore({
                variables: { offset: data.users.length },
                updateQuery: (prev, { fetchMoreResult }) => {
                  console.log("called");
                  if (!fetchMoreResult) return prev;
                  return Object.assign({}, prev, {
                    users: [...prev.users, fetchMoreResult.users],
                  });
                },
              });
            }}
          />
        </div>
      )}
    </div>
  );
};

export default App;

完全删除 updateQuery 回调函数:

fetchMore({ variables: { offset: data.users.length } });

并将缓存更改为:

import { offsetLimitPagination } from "@apollo/client/utilities";

const cache = new InMemoryCache({
  typePolicies: {
    Query: {
      fields: {
        users: offsetLimitPagination(),
      },
    },
  },
});

所以你在 graphql 中的查询必须有 offset 和 limit 参数。

其他选项有:concatPagination and relayStylePagination

如果需要区分对同一字段的不同请求users前任。输入 keyArg:offsetLimitPagination(["filters"])并使用过滤器 arg 查询您的用户。缓存会单独存储它。

更多信息在正式发布 https://www.apollographql.com/blog/announcing-the-release-of-apollo-client-3-0/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Apollo 3 分页与字段策略 的相关文章

随机推荐

  • 如何锁定表...做事...使用 Spring Boot 解锁表?

    这个想法基本上是扩展some具有自定义功能的存储库 所以我得到了这个设置 它确实有效 MappedSuperclass abstract class MyBaseEntity Id GeneratedValue strategy Gener
  • PHP 中的 ' 和 " 有什么区别? [重复]

    这个问题在这里已经有答案了 可能的重复 PHP 不同的引号 https stackoverflow com questions 1318028 php different quotes 简单的问题 php 中 和 有什么区别 什么时候应该使
  • 将密码重置邮件模板替换为自定义模板 laravel 5.3

    我为身份验证系统执行了 laravel 命令 php artisan make auth它为我的应用程序制作了身份验证系统 几乎一切都正常 现在 当我使用忘记的密码时 它会向我的邮件 ID 发送一个令牌 我看到模板包含 laravel 和一
  • 具有 2FA 的 Asp.Net Identity - 记住会话后不保留浏览器 cookie

    我正在使用带有 Asp Identity 和两因素身份验证的 MVC5 2 的最新示例代码 启用 2FA 后 当用户登录时 系统会提示输入代码 通过电话或电子邮件发送 并且他们可以选择 记住浏览器 这样他们就不会在该浏览器上再次要求输入代码
  • 在flex中以编程方式获取SIM号码

    我想以编程方式获取SIM号码 在flex中可以吗 在android开发人员指南中我看到了电话管理器类 同样我们在flex中有什么东西吗 提前致谢 看看这个 这确实是一个 hack 但却是您从 Flex Mobile 调用 Java API
  • 使用不带操作栏的选项菜单

    我正在使用它来隐藏 Android 应用程序中的操作 标题栏 this requestWindowFeature Window FEATURE NO TITLE 我用这个创建了我的选项菜单 MenuInflater inflater get
  • Android 每 4 秒运行一个任务

    您好 我需要每 4 秒调用一个方法 即使设备处于睡眠状态 我使用带有服务 Start stick 的警报管理器 服务名称为 TransactionService 当设备处于活动状态并且每 4 秒调用一次该方法时 代码运行良好 但是当屏幕锁定
  • Django+MongoDB 与 Node.js+MongoDB

    我已经建立并运行了一个带有使用 Python Django MySQL 构建的同步服务的网站 很长一段时间以来 我一直在关注 Node js 和 MongoDB 方面 我即将做出决定 将系统的一部分迁移到 MongoDB 该系统托管来自用户
  • 在回发期间保留 C# 对象

    我有一个 asp net 页面 其中包含 C 代码隐藏 它在 Page Load 方法中执行一些操作 例如查询数据库并进行一些其他调用以使用数据填充对象 然后我在页面上显示这些数据 这一切都很好 我设置了几个回发 以便当单击列表框中的值时
  • R中按字符串列名聚合

    我想按两列对 data frame 中的数据进行分组 然后对特定的第三列进行求和 例如 gt aggregate mpg gear cyl data mtcars FUN sum gear cyl mpg 1 3 4 21 5 2 4 4
  • GUI 开发人员如何处理可变像素密度?

    当今的显示器在尺寸和分辨率方面具有相当大的范围 例如 我的 34 5 厘米 19 5 厘米显示屏 对角线为 39 6 厘米或 15 6 英寸 具有 1366 768 像素 而对角线为 15 英寸的 MacBook Pro 第三代 具有 28
  • 使用 dplyr 将组汇总为区间

    H 我有一个像这样的数据框 d lt data frame v1 seq 0 9 9 0 1 v2 rnorm 100 v3 rnorm 100 gt head d v1 v2 v3 1 0 0 0 01431916 0 5005415 2
  • 如何使用 JodaTime 获取一年中的天数?

    我已尝试以下方法但无济于事 new Period Years ONE getDays new Period 1 0 0 000 getDays 我想要的答案显然是365 你想要的答案并不明显365 它是365 or 366 您在示例中没有考
  • Rancher - 如何公开我的服务?

    我有一个正在运行的 Rancher 设置 如下所示 主机 运行牧场主 https github com rancher rancher容器 在公共IP上 无法从 Internet 访问专用网络 10 1 1 0 24 中的节点 我的目标是使
  • bootstrap-vue 选择带有过滤器选项的组件?

    在带有 bootstrap vue 的 vue 项目中 我搜索选择组件的工作原理https bootstrap vue js org docs components form select https bootstrap vue js or
  • 在同一个“分配”对象上多次调用初始化程序是否安全?

    我可以构建一个UIImageView对象与myImageView UIImageView alloc initWithImage image 如果我想更改 UIImageView 上的图像 则影响显示的应用程序活动如下 我可以通过重新分配它
  • 现代 x86 成本模型

    我正在编写一个带有 x86 后端的 JIT 编译器 并一边学习 x86 汇编程序和机器代码 我大约 20 年前使用过 ARM 汇编器 对这些架构之间成本模型的差异感到惊讶 具体来说 内存访问和分支在 ARM 上的成本很高 但等效的堆栈操作和
  • 当模态弹出窗口打开时,防止移动“后退按钮”退出网站,而是关闭弹出窗口

    当模式弹出对话框打开时 即使我添加关闭按钮 通常是右上角的 X 移动设备上的一些用户也会使用移动设备的 后退按钮 来关闭弹出窗口 但这将退出该网站 如何让手机 后退按钮 关闭弹窗而不是退出网站 document getElementById
  • Firebase - 更改我的项目的国家/地区

    我在 firebase 中创建项目时错误地选择了错误的国家 地区 正如你在这里看到的 这可以解决吗 我知道项目 ID 无法更改 而且我喜欢我选择的 ID As 文档说 https firebase google com support gu
  • Apollo 3 分页与字段策略

    有人可以提供使用 Apollo Client 3 0 字段策略实现分页的示例吗 我一直在遵循文档中的示例来实现无限滚动 但在我的控制台中我收到以下警告 The updateQuery callback for fetchMore is de