Назначение @relay(pattern:true)

Новое выражение @relay(pattern: true) был введен в журнал изменений для relay.js0.5,

Но не могу понять из описания, ни тестов, что именно он делает, и когда я должен использовать это при написании fatQueries,

Некоторый пример был бы очень полезен.

1 ответ

Решение

Рассмотрим запрос GraphQL следующим образом:

viewer {
  friends(first: 10) {
    totalCount
    edges { node { name } }
    pageInfo { hasNextPage }
  }
}

При определении сложного запроса для мутации Relay включение имени поля без указания какого-либо из его подполей говорит Relay, что любое подполе этого поля может измениться в результате этой мутации.

К сожалению, чтобы пропустить аргументы подключения, такие как find, first, а также last на friends поле вызовет ошибку проверки в зависимых от аргумента поля edges а также pageInfo:

getFatQuery() {
  return Relay.QL`
    fragment on AddFriendMutationPayload {
      viewer { 
        friends { edges, pageInfo }  # Will throw the validation error below
      }
    }
  `;
}

// Uncaught Error: GraphQL validation/transform error ``You supplied the `pageInfo` 
// field on a connection named `friends`, but you did not supply an argument necessary 
// to do so. Use either the `find`, `first`, or `last` argument.`` in file 
// `/path/to/MyMutation.js`.

Вы можете использовать @relay(pattern: true) директива, указывающая, что нужно использовать толстый запрос для сопоставления с шаблоном по отслеживаемому запросу, а не использовать его как полноценный запрос.

getFatQuery() {
  return Relay.QL`
    fragment on AddFriendMutationPayload @relay(pattern: true) {
      viewer {
        friends { edges, pageInfo }  # Valid!
      }
    }
  `;
}

Для получения дополнительной информации о мутациях см.: https://facebook.github.io/relay/docs/guides-mutations.html

Другие вопросы по тегам