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