Reactjs 使用Relay和GraphQL进行查询

Reactjs 使用Relay和GraphQL进行查询,reactjs,graphql,relayjs,Reactjs,Graphql,Relayjs,我正在学习React+Relay+GraphQL@ 我对接口:[nodeInterface]在GraphQL对象定义中的作用感到困惑 对于符合中继的GraphQL服务器,具有全局ID的对象称为节点,任何节点都可以通过查询进行重新提取 { node: (id: "some global id") { id, ... on SomeType { someField } } } 节点接口用于GraphGL架构上的节点,它帮助您定义具有全局id的类型 查看

我正在学习React+Relay+GraphQL@


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

对于符合中继的GraphQL服务器,具有全局ID的对象称为
节点
,任何
节点
都可以通过查询进行重新提取

{
  node: (id: "some global id") {
    id,
    ... on SomeType {
      someField
    }
  }
} 
节点
接口用于GraphGL架构上的节点,它帮助您定义具有全局id的类型

查看详细信息,这是简短的回答
nodeInterface
仅当客户端(通常是浏览器)请求重新获取其在初始获取时已经拥有的GraphQL数据时,GraphQL才会使用

在以下任何情况下执行重新提取:

  • 不同/相同的React组件(在同一网页上)在稍后阶段请求额外的数据段,而这些数据在获取的初始数据中不可用
  • React组件中的代码执行
    this.props.relay.forceFetch()
    ,如果程序员认为服务器端的数据可能由于其他外部原因发生了更改,则通常会发生这种情况
  • React组件中的代码在用户执行需要更改初始获取数据的操作(如更改要显示的项目数、图片大小等)时执行
    this.props.relay.setVariable(…)
在重新获取期间,GraphQL使用(全局)节点ID调用
nodeInterface
,而
nodeInterface
需要该节点ID来检索与该节点ID关联的服务器端对象。使用该服务器端对象,GraphQL服务器可以返回客户端所需的额外/变化的数据

因此,如果初始对象数据从未被复制,则不需要节点ID

有关详细信息,请参阅:

细节
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类型需要节点ID,因此在GraphQL模式中,您需要:

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

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

    ... other fields ...

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