如何与另一个查询共享缓存的 apollo 客户端数据

IT技术 reactjs shopify graphql apollo react-apollo
2021-05-21 09:06:05

我使用apollo-client@2.3.x(& react-apollo@2.1.x) 和标准InMemoryCache,通过他们的 GraphQL Storefront API 查询 Shopify 商店。

我有两个查询:1. getProducts(in <Home />) 和 2. getProduct($id)(in <ProductDetail />)。在场景从 开始<Home />,然后单击产品时,我希望<ProductDetail />组件在查询 2 运行之前显示来自查询 1 的缓存响应。

在demo中可以看到,当点击产品时,控制台data是一片空白{},直到第二次网络请求完成。我假设它会被缓存,因为查询共享相同的__typename,并使用“节点”结构。

有人可以在这里启发我,(A)为什么它不起作用,以及(B)我怎样才能做到这一点?


以下是两个查询的摘要:

1:“ getProducts ”(例如在<Home />组件中使用)

query getProducts {
  shop {
    products(first: 20) {
      edges {
        node {
          id
          ... on Product {
            title
          }
        }
      }
    }
  }
}

2:“ getProduct ”(例如在<ProductDetail />组件中使用)

query getProduct($id: ID!) {
  node(id: $id) {
    ... on Product {
      title
    }
  }
}
1个回答

GraphQL 客户端无法对解析器的实现做出假设,即使对于人类来说,API 似乎遵循一种简单的模式并且查询的行为似乎微不足道。您需要帮助使用Cache Redirect

好的,我在这里为你试过了。我并不真正使用这些 Relay API,但它的工作方式应该与示例非常相似。

  cacheRedirects: {
    Query: {
      getProduct: (_, args, { getCacheKey }) => ({
        __typename: 'Node',
        node: getCacheKey({ __typename: 'Product', id: args.id }),
      }),
    },
  },