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

标签 graphql apollo apollo-client

我找不到或我在错误的地方寻找有关片段如何匹配的任何文档。当我使用 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/

相关文章:

node.js - 如何在变异graphQL Playground中传递变量?

reactjs - Apollo客户端的片段组合: convention and boilerplate

reactjs - Apollo graphql 连接的 React 组件不会重新渲染

apollo - 在 Apollo 客户端中,我如何能够记录或拦截所有操作(查询和突变)

javascript - 创建客户端后(登录后)将上下文链接添加到 Apollo Link

java - Karate - GraphQL - 如何验证架构然后响应?

graphql - 从字段解析器上的父节点获取数据

express - GraphQL 架构不会导入

javascript - 处理 JavaScript 中的类方法名称冲突

javascript - 如何将计算状态添加到 React Apollo 中的图形对象?