为什么我们需要“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”? 的相关文章

随机推荐