Apollo не предоставляет хук для одновременного запроса нескольких операций. Однако GraphQL поддерживает запрос нескольких root полей на операцию. Этот факт в сочетании с возможностью создания псевдонимов полей означает, что вы можете получить все необходимые данные в одном запросе.
При составлении запросов обычно следует избегать интерполяции строк, но в этом случае нам потребуется использовать его.
const MyComponent = (options) => {
const query = gql`
query SomeNameForYourOperation (
${options.map((option, index) => `$opt${index}: SomeInputType!`).join('\n')}
){
${options.map((option, index) => `
alias${index}: someRootField(someArgument: $opt${index}) {
...SomeTypeFragment
}
`).join('')}
}
fragment SomeTypeFragment on SomeType {
someField
someOtherField
}
`
const variables = options.reduce((memo, option, index) => {
return { ...memo, [`opt${index}`]: option }
}, {})
const { data, loading, error } = useQuery(query, { variables })
if (data) {
// data.alias0
// data.alias1
// etc.
// You can also iterate through options again here and access the
// appropriate alias by the index
}
}
Это выглядит немного сложно, но на самом деле это довольно просто. Мы генерируем определения переменных путем итерации по options
(в итоге мы получаем переменные типа $opt0
, $opt1
и т. Д. c.). Затем мы снова перебираем опции, чтобы сгенерировать набор выбора для root. Для каждого параметра мы добавляем одно и то же поле в наш запрос, но используем его псевдоним (например, alias0
, alias1
и т. Д. c.), А затем передаем другую переменную в аргумент для поля. Наконец, мы используем фрагмент, чтобы сохранить размер результирующего запроса управляемым.
Мы также должны передать объект variables
в useQuery
, который соответствует сгенерированным нами определениям переменных, поэтому мы reduce
options
массив в объект с соответствующим именем свойства.
Конечно, вам нужно изменить приведенный выше пример, чтобы включить типы, поля и аргументы, указанные c в ваш запрос. Конечным результатом является то, что у вас есть один набор переменных data
, loading
и error
. После загрузки запроса вы можете получить доступ к каждому результату под соответствующим псевдонимом (alias0
, et c.).