#graphql #apollo-client
Вопрос:
Я довольно новичок в GraphQL и клиенте Apollo.
На данный момент в моем API GraphQL есть запрос такого типа:
type Directory { name: String id: String parentId: String files: [PaginatedFiles] children: [Directory] ... }
Первоначально у меня был один запрос для извлечения всех полей из приведенного выше типа, но через некоторое время я решил реализовать бесконечную прокрутку (извлекает 20 файлов каждый раз, когда пользователь прокручивает страницу) для файлов (потому что иногда в каталоге до 1000 файлов).
Чтобы использовать fetchMore
функцию крючков Apollo, мы решили создать 2 запроса, которые используют один и тот же тип (Каталог), но имеют разные поля:
query getDirectory($id: String!) { directory(id: $id) { name id parentId children } } query getDirectoryFiles($directoryId: String!, $after: String) { directory(id: $directoryId) { files(after: $after) { after items { ...FileBaseFields } } } }
В этом случае graphql-codegen создает крючки для меня, поэтому я использую их так:
const [fetchDirectory, { loading: directoryLoading, data: directory }] = useFetchDirectoryLazyQuery() const [fetchDirectoryFiles, { loading: directoryFilesLoading, data: directoryFiles, fetchMore, }] = useFetchDirectoryFilesLazyQuery()
С таким подходом я могу использовать fetchMore
, предоставляя ему переменные («directoryId» и «после»).
Нормально ли иметь два запроса, которые используют один тип, или мне следует создать два отдельных типа (обработчики)?
Комментарии:
1. все в порядке, apollo [как нормализующий кэш] подключит реквизиты из обеих записей каталога [по идентификатору] … вставка
debugger
в код, изучение записей кэша клиента apollo