Fragmenty GraphQL: nazwane, inline i warunki typu | We.Inc
Buduj fragmenty GraphQL w kreatorze zapytań na żywo: nazwane fragmenty do ponownego użycia, inline fragmenty dla unii i interfejsów, warunki typu, __typename i zmienne.
Fragment GraphQL to nazwany zestaw pól wielokrotnego użytku dla jednego typu, zapisywany jako fragment Name on Type i dołączany do zapytania przez ...Name. Inline fragment, zapisywany jako ... on Type, nie ma nazwy i wybiera pola tylko wtedy, gdy wynik jest tym konkretnym typem, i właśnie tak odpytuje się unie i interfejsy.
Postacie fragmentów
Postać
Składnia
Do czego służy
Nazwany fragment
fragment UserCard on User { ... }
Współdzielenie jednej listy pól między zapytaniami
Spread
...UserCard
Dołączanie pól nazwanego fragmentu
Inline fragment
... on Photo { url }
Pola jednego elementu unii lub interfejsu
Inline bez typu
... @include(if: $full) { bio }
Nakładanie dyrektywy na grupę pól
Nazwa typu
__typename
Rozróżnianie elementów unii w odpowiedzi
Zaznacz w kreatorze potrzebne pola, a on napisze za Ciebie zapytanie, raz z nazwanym fragmentem, a raz z polami wpisanymi bezpośrednio, abyś zobaczył, że proszą o te same dane. Włącz opcję wyników wyszukiwania, aby dodać inline fragmenty na unii.
Zaznacz pola User, które pokazuje karta na Twoim ekranie.
Wybierz, czy pola trafią do nazwanego fragmentu, czy bezpośrednio do zapytania.
Włącz wyniki wyszukiwania, aby dodać pole unii z inline fragmentem dla każdego typu członkowskiego.
Skopiuj zapytanie i uruchom je na schemacie, który ma te typy.
Nazywaj fragmenty od komponentu, który ich używa, na przykład UserCard lub PostRow, aby każda część ekranu deklarowała własne potrzeby danych.
Zawsze dodawaj __typename, gdy wybierasz z unii lub interfejsu. Twój kod potrzebuje go, aby wiedzieć, który element otrzymał.
Fragmenty mogą czytać zmienne operacji, więc pole we fragmencie może przyjąć argument, na przykład size: $avatarSize.
Fragment nie może rozwijać sam siebie, ani bezpośrednio, ani przez inny fragment. Walidacja odrzuca taki cykl, zanim cokolwiek się wykona.
Najczęściej zadawane pytania
Czy fragmenty zmniejszają odpowiedzi?
Nie. Fragment to pomoc przy pisaniu zapytania. Serwer go rozwija, a odpowiedź wygląda dokładnie tak, jakbyś wpisał pola ręcznie. Jeśli dwa spready wybierają to samo pole, pojawia się ono raz.
Kiedy muszę użyć inline fragmentu?
Gdy pole zwraca unię lub interfejs, a potrzebujesz pól, które mają tylko niektóre typy członkowskie. graphql.org pokazuje to na przykładzie bohatera, który może być typem Droid z primaryFunction albo Human z height.
Czy fragmentu można użyć na innym typie?
Tylko tam, gdzie może mieć zastosowanie. Fragment na interfejsie można rozwinąć wewnątrz dowolnego typu obiektowego, który go implementuje, ale fragment na User rozwinięty w selekcji Post nie przechodzi walidacji.
Gdzie w dokumencie umieszcza się fragmenty?
Na najwyższym poziomie dokumentu, obok operacji, w dowolnej kolejności. Każdy zdefiniowany fragment musi zostać użyty, inaczej serwer odrzuci dokument jako niepoprawny.
Nazwane fragmenty do ponownego użycia
Załóżmy, że nagłówek profilu, komentarz i lista członków pokazują imię i awatar. Trzykrotne wpisywanie tych pól zaprasza rozjazd: jedna kopia zyskuje pole, którego brakuje pozostałym. Fragment na User trzyma listę w jednym miejscu, a każde zapytanie go rozwija.
Aplikacje oparte na komponentach idą dalej. Każdy komponent deklaruje potrzebny mu fragment, a zapytanie strony rozwija fragmenty renderowanych komponentów, więc potrzeby danych żyją obok kodu, który z nich korzysta.
Inline fragmenty i warunki typu
Część on Type to warunek typu. W nazwanym fragmencie mówi, do którego typu należą pola. W inline fragmencie wewnątrz pola unii sprawia, że te pola obowiązują tylko wtedy, gdy obiekt jest tym typem.
Klasycznym przypadkiem jest wyszukiwanie zwracające użytkowników, posty i zdjęcia. Selekcja wymienia ... on User, ... on Post i ... on Photo, każdy z własnymi polami, a __typename mówi klientowi, którą gałąź wybrał każdy wynik.
Schemat używany przez kreator
Unia dla wyników wyszukiwania
SearchResult może być typem User lub Photo, więc selekcja na nim potrzebuje inline fragmentów, aby dotrzeć do pól któregokolwiek z elementów.
Odczyt odpowiedzi z unii
Co zwraca wyszukiwanie
Każdy element zawiera tylko pola własnej gałęzi oraz __typename.
Rozgałęzianie po __typename
Nazwa typu to bezpieczny sposób na rozróżnienie elementów. Sprawdzanie obecności pola może się zepsuć, gdy typ później je zyska.
Kreator zapytań z fragmentami
Pola User do wybrania
Użyj nazwanego fragmentu (UserCard)
Dodaj wyniki wyszukiwania (unia z inline fragmentami)