为什么GraphQL片段在查询中需要__typename?

时间:2017-08-04 14:21:11

标签: graphql apollo apollo-client

我找不到或者我在错误的地方查找有关片段如何匹配的任何文档。当我使用香草Apollo客户端时,如果我在使用片段时关闭addTypename选项,我会收到警告heuristic fragment matching going on!,如果我添加它会消失,但我的回复包含很多__typename我不需要的领域。他们为什么帮忙?

1 个答案:

答案 0 :(得分:5)

之所以这样做,是因为ApolloClient与Relay一样,使用全局存储在客户端上缓存数据。

为您执行此操作,需要全局ID。由于某些原因,全局ID并不是人们所想的,实际上,人们一直在切换到Relay时会抱怨。

ApolloClient为此提供了一个聪明的解决方案! (如果我错了,阿波罗团队会纠正我的意见)他们可以让您定义如何在存储中键入记录!默认情况下,它使用类型名和ID来创建Relay建议您创建的一种全局ID。这就是为什么他们需要类型名称。

由于您要关闭查询中的类型名称,因此Apollo会做一些聪明的事情来尝试确定类型(以及商店中的钥匙)。这些聪明的东西可能会给您带来麻烦。

如果您要创建自己的全局ID而不是使用所有这些聪明的东西,则可以这样指定:

const cache = new InMemoryCache({
  dataIdFromObject: object => object.key || null
});

https://www.apollographql.com/docs/react/advanced/caching.html#normalization