使用Relay和GraphQL进行查询

时间:2015-09-01 17:34:26

标签: reactjs graphql relayjs

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

的教程

我对什么接口感到困惑:[nodeInterface]在GraphQL对象定义中做了什么。

2 个答案:

答案 0 :(得分:7)

简答

当客户端(通常是浏览器)请求从初始获取中获取的一段GraphQL数据时,

this.props.relay.forceFetch()仅由GraphQL使用,以便重新获取。

在以下任何一种情况下都会重新获取:

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

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

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

有关详细信息,请参阅:https://medium.com/@khor/relay-graphql-de-mystifying-node-id-38757121b9c

详细信息

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) } ... } ) 执行节点ID到服务器端对象解析,因此它总是看起来像:

globalIdField

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

  • 请求GraphQL在创建GraphQL类型实例时使用interface : [nodeInterface]关键字
  • 自动生成节点ID
  • 告诉GraphQL GraphQL类型如何解析在重新获取回相应的服务器端对象时提供的节点ID,这是您的var ClassAType = new GraphQLObjectType({ name: 'ClassA', description: 'A',   fields: () => ({   id: globalIdField('ClassA'), ... other fields ... }), interfaces: [nodeInterface], });

因此:

{{1}}

答案 1 :(得分:5)

对于符合Relay标准的GraphQL服务器,具有全局ID的对象称为Node,任何node都可以通过查询重新提取

{
  node: (id: "some global id") {
    id,
    ... on SomeType {
      someField
    }
  }
} 

Node接口用于GraphGL架构,可帮助您定义具有全局ID的Type。

查看Global Object IdentificationSpecification

的详细信息