为什么我们需要“cacheRedirects”?

2024-01-04

我阅读了文档与缓存数据交互 https://www.apollographql.com/docs/react/caching/cache-interaction/#cache-redirects-with-cacheredirects虽然我明白如何cacheRedirects有效,我有点困惑为什么首先需要它。这是我问另一个问题的部分原因:Apollo客户端是否缓存React中的嵌套对象 https://stackoverflow.com/questions/58842929/does-the-apollo-client-cache-nested-objects-in-react?

我们知道数据很可能已经在客户端缓存中,但由于它是通过不同的查询请求的,Apollo 客户端并不知道这一点。

这是为什么?

为了清楚起见,复制粘贴文档中的示例:

query ListView {
  books {
    id
    title
    abstract
  }
}

query DetailView {
  book(id: $id) {
    id
    title
    abstract
  }
}

Apollo 将接收到的数据缓存在归一化 https://www.apollographql.com/docs/react/caching/cache-configuration/#data-normalization manner.

If your ListView返回数据如下:

{
  "data": {
    "books": [
      {
        "id": 1,
        "title" "ABC",
        "__typename": "Book"
      },
      {
        "id": 2,
        "title" "DEF",
        "__typename": "Book"
      }
    ]
  }
}

每本书将根据其键存储在缓存中id and __typename (Book:1, Book:2, ETC。)。然后,这个特定的缓存键列表与books根字段。如果您要求books再次,Apollo 会看到缓存中已经有该查询,并将根据键列表重新创建结果。

If books接受一些参数,然后每组参数都被视为不同的缓存条目。books(onSale: true)可能会返回一组不同的书books(subject: "Computer Science")。每组缓存键都是单独存储的。如果您运行第一个查询,然后运行第二个查询,则第二个查询将是缓存未命中,并且仍会命中服务器。

同样,您可以有一个带有一些参数并返回一本书的查询,例如book(id: 1)。然而,在所有这些例子中,阿波罗并不“理解”论点是什么id and onSale是。这些参数与返回结果的关系是业务逻辑的一部分。 Apollo“知道”的只是给定这个查询和这组参数,您将获得这个特定的对象或对象数组。

作为一个人,我可以通过命名查询来推断,例如book(id: 2)返回一本 id 为2。但是像 Apollo 这样的库无法准确推断该信息 - 它如何猜测字段的正确类型或者它返回单个对象而不是对象数组?就此而言,它如何推断出id: 2翻译为“Book where id = 2”?毕竟,实际的论点可以有多种方式:book(identifier: 2), book(filter: { id: 2 }), etc.

所以我们使用cacheRedirects“教”Apollo 如何查找可能已经在我们的缓存中的数据。这有效地复制了通常驻留在服务器上的一些业务逻辑,但有助于我们避免对服务器的额外调用。

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

为什么我们需要“cacheRedirects”? 的相关文章

  • React-relay 嵌套突变后未获取有效负载

    这是一个后续问题这个答案 https stackoverflow com a 34776023 2030321早些时候在 SO 上发布了有关反应中继突变警告的文章 在这种情况下 您需要做的是将 FeatureLabelNameMutatio
  • Graphql 字段在类型上不存在

    浏览完 Graphql 的文档后 我开始在一个玩具 Rails reactJS 项目上实现它 这些项目允许用户通过设备登录 然后访问显示艺术家列表的虚拟 艺术家路径 一切似乎都工作正常 直到我尝试使用 React 应用程序中的 GraphQ
  • React 未捕获的不变违规:在 ApolloConsumer 的上下文中找不到“客户端”。将根组件包装在

    我有一个使用 React 应用程序react apollo 2 5 8以及我通过 NPM 安装并在应用程序中使用的自定义组件库 图书馆有react apollo 2 5 8列在对等和开发依赖项中 自从我将 React apollo 升级到
  • Apollo 无法在更新中访问 queryVariables:突变后

    我正在尝试使用 update 在执行突变后更新查询 问题是商店中的查询应用了多个不同的变量 我想更新查询并使用相同的变量返回它 我在文档中发现 updateQueries 有一个包含 queryVariables 的选项 它们是执行查询时使
  • 调用 DynamoDB 中的用户数据时渲染得太晚

    所以我试图从dynamoDB 我正在使用一个GraphQL API访问我的数据库 在提供的代码的注释部分中 我提到我已经尝试过users 1 friends map 它确实返回正确的朋友列表数组 但用户似乎直到朋友列表渲染后才被设置 我应该
  • Apollo 客户端“未找到命名导出‘删除’”

    我正在尝试创建一个apollo client插件Nuxt 3应用 它当前抛出有关名为的包的错误ts invariant file Users my name Repositories project node modules apollo
  • 使用 buildSchema 时如何访问字段解析器内父解析器的值?

    当我们使用 graphqlHTTP 时 传递给解析方法的第一个参数实际上是客户端查询传递的参数 而不是 root 这对于查询解析器来说很好 但是对于字段解析器需要知道父级值的用例 如何实现这一点 type Person name Strin
  • 如何在Union中查询不同类型的同一字段?

    我有以下型号 type Duck category Baz type Foo size FooSize type Bar size BarSize union Baz Foo Bar 以下查询会引发错误Validation error of
  • Graphql 将多个查询合并(组合)为一个?

    我正在尝试使用 JavaScript 将多个 GraphQL 查询合并为一个查询 我正在寻找这样的东西 let query3 mergeQueries query1 query2 我们事先不知道哪些查询将被组合 假设我有这样的查询 输入查询
  • Gatsby 的 GraphQL 查询 - 具有灵活内容模型的内容设置

    我有一个gatsby网站与内容丰富的插件 and graphql 查询 设置正在运行 编辑 我的 gatsby 设置使用 pageCreate 功能动态提取数据 并填充我的模板组件 即我在下面共享的根 graphql 查询 如果 conte
  • Relay 中的嵌套片段数据始终相同

    我是 Relay 新手 并且遇到了片段上嵌套数据的问题 当我在 graphiql 中进行测试时 以下查询返回正确的数据 因此我确信我的架构是正确的 viewer customers name billing address city 但是
  • apollo 客户端从存储中删除而不发生突变

    我需要通过 id 从本地存储中删除一条 记录 而不使用突变 因为服务器不支持突变 我尝试像这样手动访问商店 delete this apolloClient store getState apollo data 1112 这会删除记录 但是
  • AWS Amplify Appsync 解决创建具有关系的对象时出现的错误

    我正在尝试创建一个具有关系的对象 我正在使用自动生成的放大突变 当我创建一个没有关系的对象时 操作会成功 当我创建具有关系的对象时 操作失败 我收到的错误消息是 The variables input contains a field na
  • 使用 JWT 通过 Asp.net core 进行 GraphQL 身份验证

    我正在使用 NET 的 GraphQL https www nuget org packages GraphQL 2 0 0 alpha 912graphql 的包 但我无法理解如何在 graphql 查询或突变中使用 JWT 进行身份验证
  • GraphQL & 使用嵌套订阅函数

    我正在编写一个 graphql 订阅服务器 如果我编写一个查询 将解析器嵌套在另一个解析器中是没有问题的 因此查询将如下所示 query messages privateMessage id message userId 所以首先messa
  • AWS AppSync 授权

    我计划使用 AWS Appsync 迁移 lambda 函数中的 graphQL 终端节点 该函数由 API 网关的 POST 触发 我研究 AppSync 主要是因为订阅 我无法使用 Lambda 函数创建订阅 我的身份验证机制基于 Au
  • 带有 ManyToMany 和直通表的 Graphene-django

    我的应用程序有多个多对多关系具有贯穿模型像这样 class Person models Model name models CharField class Group models Model name models CharField m
  • 由于 apollo-client 未定义,无法解构 GraphQL 查询?

    我正在寻找调试与错误消息相关的问题 未捕获的类型错误 无法解构 0 apollo client WEBPACK IMPORTED MODULE 4 useQuery 因为它未定义 Context 我正在为我的 React js 项目设置后端
  • 石墨烯错误消息

    我想知道是否可以翻译石墨烯提供的验证错误消息 例如 未提供身份验证凭据 如下面的代码示例所示 errors message Authentication credentials were not provided locations lin
  • Apollo 客户端延迟刷新

    In Apollo Client v3React 实现 我使用钩子来使用订阅 当我从订阅接收数据时 我想重新获取查询 但前提是查询之前已执行过并且位于缓存中 有办法实现这一点吗 我首先进行惰性查询 然后在收到订阅数据时手动检查缓存 然后尝试

随机推荐