Ответ 1
Корневое поле Node
в сочетании с глобально уникальными идентификаторами вступает в игру, когда Relay необходимо восстановить объект. Повторный вызов происходит, когда вы вызываете this.props.relay.forceFetch()
или когда вы добавляете поля в запрос для объекта, глобальный идентификатор которого известен, потому что он уже частично извлечен.
В подобных случаях Relay будет коротко закоротить регулярный запрос и выполнить запрос для объекта (ов) напрямую, используя его глобальный идентификатор и корневой вызов Node
.
Пример:
Предположим, что $showComments
был false
, когда этот запрос был сначала разрешен.
query {
viewer {
stories(first: 10) {
edges {
node {
id,
comments(first: 10) @include(if: $showComments) {
author,
commentText
}
text,
}
}
}
}
}
Это вызвало выборку для id
и text
для некоторого количества историй, чьи идентификаторы теперь известны.
Представьте, что в какое-то время переменная $showComments
стала true
. Реле будет восстанавливать только нужные ему данные с помощью корневого поля Node
.
query {
node(id: "ABC123") {
fragment on Story { comments(first: 10) { author, commentText } }
}
node(id: "DEF456") {
fragment on Story { comments(first: 10) { author, commentText } }
}
node(id: "GHI789") {
fragment on Story { comments(first: 10) { author, commentText } }
}
...
}
Это зависит от нескольких частей:
- Каждый объект должен иметь глобально уникальный идентификатор или быть идентифицирован парой типа/идентификатора (помощник
globalIdField
делает это и создает строку с кодировкой base64). - Сервер должен знать, как разрешить объект из уникального глобального идентификатора, и наоборот. Это то, что для
nodeDefinitions
для. - Любой объект, который надеется быть повторно подключенным с помощью этой системы, должен реализовать
nodeInterface
.
Смотрите также: https://facebook.github.io/relay/docs/graphql-object-identification.html#content