reactjs - 使用 Relay 和 GraphQL 进行查询

标签 reactjs graphql relayjs

我正在关注 React + Relay + GraphQL @ https://facebook.github.io/relay/docs/tutorial.html 的教程

我对接口(interface):[nodeInterface] 在 GraphQL 对象定义中的作用感到困惑。

最佳答案

简短回答

nodeInterface 仅在客户端(通常是浏览器)请求重新获取初始获取时已拥有的 GraphQL 数据时,GraphQL 使用。

在以下任何情况下都会执行重新获取:

  • 不同/相同的 React 组件(在同一网页上)在稍后阶段请求额外的数据,而这些数据在获取的初始数据中不可用
  • React组件中的代码执行this.props.relay.forceFetch(),如果程序员认为服务器端的数据可能由于其他外部原因而发生了变化,通常会发生这种情况
  • 当用户执行更改要显示的项目数量、图片大小等操作时,React 组件中的代码会执行 this.props.relay.setVariable(...),这需要对最初获取的数据进行变体。

在重新获取期间,GraphQL 使用(全局)节点 ID 调用 nodeInterfacenodeInterface 需要检索与该节点 ID 关联的服务器端对象。通过该服务器端对象,GraphQL 服务器可以返回客户端所需的附加/变体数据。

因此,如果初始对象数据永远不会被重新感染,则永远不需要节点 ID。

更多详情请引用:https://medium.com/@khor/relay-graphql-de-mystifying-node-id-38757121b9c

详细信息

nodeInterface 执行节点 ID 到服务器端对象解析,因此它总是看起来像:

var {nodeInterface, nodeField} = nodeDefinitions(
  (globalId) => {
    var {type, id} = fromGlobalId(globalId);

    if (type === 'ClassA') {
      // Get ClassA type of instance with id
      // E.g.,
      return ClassA.find_by_id(id)
    } else if (type === 'ClassB') {
      return ClassB.find_by_id(id)
    }

    ...
  }
)

由于需要重新获取的 GraphQL 类型需要 Node ID,因此在 GraphQL 架构中您需要:

  • 请求 GraphQL 在创建 GraphQL 类型的实例时使用 globalIdField 关键字自动生成节点 ID
  • 告诉 GraphQL 该 GraphQL 类型如何将重新提取期间提供的节点 ID 解析回相应的服务器端对象,即您的接口(interface):[nodeInterface]

因此:

var ClassAType = new GraphQLObjectType({
  name: 'ClassA',
  description: 'A',
  fields: () => ({
    id: globalIdField('ClassA'),

    ... other fields ...

  }),
  interfaces: [nodeInterface],
});

关于reactjs - 使用 Relay 和 GraphQL 进行查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32337701/

相关文章:

javascript - React Native - 在子事件处理程序更新父状态后,子中的 .Map() 项目不会重新渲染

reactjs - 防止 Graphiql 控制台发出多个内省(introspection)查询

node.js - 如何在prisma-binding npm中获得总匹配记录数

javascript - 在 GraphQL 中上传图片

css - PrimeReact 和样式组件

reactjs - typescript 使用传播运算符抛出错误

javascript - 动态构建中继查询

javascript - 中继分页(不是无限滚动)

javascript - Chrome 开发工具的性能分析结果中的监听器

graphql - 使用中继现代 graphql 添加突变