簡體   English   中英

使用Relay和GraphQL進行查詢

[英]Query with Relay and GraphQL

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

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

簡答

當客戶端(通常是瀏覽器)請求從初始提取已經擁有的一段GraphQL數據時, nodeInterface僅由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],
});

對於符合Relay標准的GraphQL服務器,具有全局ID的對象稱為Node ,任何node都可以通過查詢重新獲取

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

Node接口用於GraphGL架構,可幫助您定義具有全局ID的Type。

檢查全局對象標識及其規范詳細信息

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM