0Pricing
React Academy · Lekcja

Hooki useQuery i useMutation

Pobierać dane za pomocą useQuery, wykonywać mutacje za pomocą useMutation i obsługiwać stany ładowania, błędu oraz danych

Hooki useQuery i useMutation to bezpłatna lekcja React Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej React Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs React Academy zawiera 4 lekcji w sumie.

Definiowanie zapytania za pomocą gql

Tag szablonu gql z @apollo/client analizuje ciąg zapytania GraphQL i przekształca go w DocumentNode w momencie ładowania modułu. Zapytania należy definiować poza komponentami: const GET_USERS = gql`query GetUsers { users { id name email } }`.

Uwaga: w kodzie produkcyjnym należy używać ciągów znaków ujętych w pojedyncze cudzysłowy i opakowanych przez gql jako tagowany template. Tag gql akceptuje składnię literału szablonowego w kodzie źródłowym JavaScript.

Wartości zwracane przez useQuery

useQuery(GET_USERS) zwraca { loading, error, data, refetch, fetchMore, networkStatus }. loading ma wartość true podczas początkowego pobierania. error zawiera błędy GraphQL lub sieciowe. data zawiera wynik zapytania zgodny ze strukturą zapytania.

Przed uzyskaniem dostępu do data należy najpierw sprawdzić loading i error, aby uniknąć renderowania wartości null.

Wzorce interfejsu ładowania i błędów

Podczas gdy loading ma wartość true, należy renderować komponent szkieletowy. Jeśli error jest zdefiniowany, należy wyświetlić komunikat o błędzie (tekst błędu można odczytać za pomocą error.message). Właściwą treść należy renderować dopiero wtedy, gdy data jest zdefiniowane, a loading ma wartość false.

Ten trójstanowy wzorzec (loading / error / data) to standardowa struktura komponentu Apollo Client.

Uzyskiwanie dostępu do danych zapytania

Obiekt data odzwierciedla strukturę zapytania GraphQL. W przypadku zapytania query { users { id name } } należy odczytać data.users, czyli tablicę obiektów {id, name}. Typy TypeScript będą zgodne, jeśli do wygenerowania typowanych hooków zostanie użyty graphql-codegen.

Bez codegen typ data ma wartość any. Z codegen wywołanie useQuery automatycznie zwraca dane w pełni typowane.

Zmienne w useQuery

Zmienne należy przekazać jako drugi argument: useQuery(GET_USER, { variables: { id: userId } }). Zapytanie jest automatycznie uruchamiane ponownie, gdy userId się zmieni, podobnie jak w przypadku tablicy zależności useEffect.

Apollo Client przechowuje w cache osobno każdą unikalną kombinację zapytania i zmiennych, dlatego GET_USER z id: "1" i GET_USER z id: "2" ma niezależne wpisy w cache.

Pomijanie zapytania

Aby zapobiec uruchomieniu zapytania, należy przekazać skip: true w opcjach: useQuery(GET_USER, { skip: !userId }). Gdy skip ma wartość true, Apollo nie wysyła żądania, loading ma wartość false, a data jest równe undefined.

Jest to odpowiednik klucza null w SWR oraz opcji enabled: false w React Query.

Ręczne ponowne pobieranie danych

Funkcja refetch zwracana przez useQuery wywołuje żądanie sieciowe niezależnie od polityki pobierania. Należy wywołać refetch() po działaniu użytkownika, które mogło zmienić dane na serwerze, na przykład po przesłaniu formularza.

Do refetch można przekazać nowe zmienne: refetch({ id: newId }), aby ponownie pobrać dane z innymi parametrami.

Śledzenie stanu sieci

Aby otrzymywać aktualizacje przy zmianie stanu sieci (pobieranie, ponowne pobieranie, odpytywanie i inne), należy przekazać notifyOnNetworkStatusChange: true w opcjach. Pole networkStatus zawiera kod liczbowy z enuma NetworkStatus.

Umożliwia to wyświetlanie subtelnego wskaźnika "refreshing" podczas trwającego ponownego pobierania w tle, bez ukrywania bieżących danych.

Sygnatura useMutation

useMutation(CREATE_USER) zwraca [mutateFunction, { loading, error, data, reset }]. Funkcja mutate jest wywoływana po przesłaniu formularza przez użytkownika. Zwraca Promise z { data, errors }.

Wywołanie mutate({ variables: { name: 'Alice', email: 'alice@example.com' } }) służy do przekazania danych wejściowych do mutacji.

Wywołania zwrotne onCompleted i onError

Do opcji useMutation należy przekazać onCompleted: (data) => navigate('/dashboard') oraz onError: (error) => showToast(error.message). Te wywołania zwrotne są wykonywane po pomyślnym zakończeniu lub odrzuceniu mutacji.

onCompleted otrzymuje dane wyniku mutacji, co pozwala uruchamiać nawigację, wyświetlać komunikaty o powodzeniu lub resetować formularze.

Optymistyczna odpowiedź w useMutation

Opcja optimisticResponse w wywołaniu mutate natychmiast zapisuje syntetyczny wynik w cache, zanim serwer odpowie. Apollo od razu renderuje optymistyczne dane, a po nadejściu odpowiedzi serwera zastępuje je rzeczywistym wynikiem.

Jeśli mutacja się nie powiedzie, Apollo automatycznie przywraca stan cache sprzed optymistycznej aktualizacji, zachowując spójność interfejsu.

Opcja skip w useQuery

Co dzieje się z useQuery po przekazaniu skip: true?

Podsumowanie lekcji

Zapytania należy definiować za pomocą tagu gql, wywoływać useQuery(QUERY, { variables, skip }) i obsługiwać stany loading/error/data. useMutation zwraca funkcję wywołującą oraz obiekt stanu; należy wywoływać ją ze zmiennymi i obsługiwać wyniki za pomocą onCompleted i onError. Odpowiedzi optymistyczne natychmiast aktualizują cache, który w razie niepowodzenia jest automatycznie przywracany do poprzedniego stanu.

Opcja skip i ponowne pobieranie danych sterowane zmiennymi obsługują warunkowe oraz parametryzowane ładowanie danych.

Często zadawane pytania

Czy lekcja „Hooki useQuery i useMutation” jest bezpłatna?

Tak — pełny tekst „Hooki useQuery i useMutation” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu React Academy, przejdź na CoddyKit PRO. Kurs React Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Hooki useQuery i useMutation”?

Pobierać dane za pomocą useQuery, wykonywać mutacje za pomocą useMutation i obsługiwać stany ładowania, błędu oraz danych Ćwiczysz React Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć React Academy?

Nie wymagamy żadnego doświadczenia. React Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.

Ile czasu zajmuje lekcja „Hooki useQuery i useMutation”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji React Academy?

Tak. Każda lekcja React Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Podstawy GraphQL dla programistów Reacta
  2. Konfiguracja Apollo Client w React
  3. Hooki useQuery i useMutation
  4. Cache Apollo: normalizacja i aktualizacje
← Powrót do React Academy