我找不到或我在错误的地方寻找有关片段如何匹配的任何文档。当我使用 vanilla Apollo 客户端时,如果我关闭了 addTypename
的选项当我使用片段时,我收到警告 heuristic fragment matching going on!
如果我添加它,它就会消失,但我的回复包含许多 __typename
我不需要的字段。他们为什么要帮助?
最佳答案
这样做的原因是 ApolloClient 和 Relay 一样,使用全局存储将您的数据缓存在客户端上。
为了为您执行此操作,需要全局 ID。出于某种原因,全局 id 不是人们想到的,实际上,人们在切换到 Relay 时一直提示它。
ApolloClient 对此有一个聪明的解决方案! (如果我错了,阿波罗团队纠正我)他们允许您定义您的记录如何在商店中键入!默认情况下,它使用 typename 和 id 来创建 Relay 建议您创建的那种全局 ID。这就是为什么他们需要类型名。
由于您关闭了查询中的 typename,Apollo 会做一些聪明的事情来尝试找出类型(以及 store 中的键)。这些聪明的东西可能会给你带来麻烦。
如果你想创建你自己的全局 id 而不是使用所有这些聪明的东西,你可以像这样指定它:
const cache = new InMemoryCache({
dataIdFromObject: object => object.key || null
});
https://www.apollographql.com/docs/react/advanced/caching.html#normalization
关于graphql - 为什么 GraphQL 片段在查询中需要 __typename?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45509228/