Queries, mutacje i subskrypcje
Używać typowanych queries i mutacji tRPC w komponentach Reacta z pełnym autocomplete i typami błędów
Queries, mutacje i subskrypcje 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 procedury zapytania
Do publicProcedure należy dołączyć .input(zodSchema).query(async ({ input, ctx }) => ...). Handler otrzymuje zweryfikowane dane wejściowe oraz kontekst żądania. Może zwrócić dowolną wartość możliwą do serializacji: obiekt, tablicę lub wartość prostą.
Typ zwracany jest automatycznie wywnioskowywany i staje się typem danych odpowiedniego hooka useQuery po stronie klienta.
Wywoływanie zapytania z React
trpc.post.getById.useQuery({ id: '1' }) wywołuje procedurę getById w routerze post. Hook zwraca znany obiekt wynikowy React Query: { data, isLoading, isError, refetch }.
Obiekt wejściowy jest typowany statycznie: przekazanie { id: 123 }, gdy schemat oczekuje ciągu znaków, powoduje błąd TypeScript wykrywany podczas programowania.
Definiowanie procedury mutacji
Do operacji zapisu po stronie serwera — tworzenia, aktualizowania lub usuwania danych — należy użyć .input(zodSchema).mutation(async ({ input, ctx }) => ...). Mutacje wywołuje się jawnie, a nie automatycznie podczas montowania komponentu.
Handler mutacji ma za pośrednictwem ctx dostęp do pełnego kontekstu żądania, w tym do sesji z NextAuth.
Wywoływanie mutacji z React
const { mutate, isLoading, error } = trpc.post.create.useMutation(). Aby uruchomić mutację, należy wywołać mutate({ title: 'New', content: '...' }). Podobnie jak useMutation w React Query, nie wykonuje się ona podczas montowania komponentu.
Do opcji useMutation należy przekazać funkcje zwrotne onSuccess i onError, aby obsłużyć działania wykonywane po mutacji.
Unieważnianie pamięci podręcznej po mutacji
Aby odświeżyć dane zapytania po pomyślnym zakończeniu mutacji, należy użyć hooka narzędzi tRPC: const utils = trpc.useUtils(). W onSuccess należy wywołać utils.post.getAll.invalidate(), aby uruchomić ponowne pobranie listy postów.
Jest to odpowiednik tRPC metody React Query queryClient.invalidateQueries() i działa według tego samego schematu oznaczania danych jako nieaktualnych i ponownego ich pobierania.
Walidacja danych wejściowych za pomocą Zod
tRPC domyślnie używa biblioteki Zod do walidacji danych wejściowych. Schemat Zod jest wykonywany na serwerze w czasie działania i odrzuca niepoprawne dane, zanim dotrą one do handlera. Ten sam schemat dostarcza typów TypeScript klientowi.
Ta podwójna rola (walidacja w czasie działania i typy TypeScript) eliminuje powielanie: kontrakt definiuje się raz w Zod, uzyskując bez dodatkowej pracy oba mechanizmy bezpieczeństwa.
Grupowanie żądań za pomocą httpBatchLink
Domyślnie tRPC używa httpBatchLink, który łączy wiele równoczesnych żądań tRPC w jedno żądanie HTTP. Wiele wywołań useQuery w tym samym cyklu renderowania komponentu jest wysyłanych i rozwiązywanych razem.
Znacznie ogranicza to narzut sieciowy w porównaniu z wysyłaniem osobnego żądania HTTP dla każdego zapytania na stronie wymagającej wielu zestawów danych.
Przegląd subskrypcji tRPC
Należy zdefiniować procedurę subskrypcji: publicProcedure.subscription(async function*() { while (true) { yield await nextEvent(); } }). Subskrypcje korzystają z generatorów asynchronicznych i wymagają transportu WebSocket.
Subskrypcje doskonale nadają się do funkcji działających w czasie rzeczywistym: bieżących powiadomień, kursorów używanych podczas wspólnej edycji lub strumieniowanych odpowiedzi AI.
Konfiguracja transportu WebSocket
Należy zastąpić httpBatchLink połączeniem httpBatchLink i wsLink za pomocą splitLink: przekierować subskrypcje do wsLink, a zapytania i mutacje do httpBatchLink. Klienta WebSocket należy utworzyć za pomocą createWSClient({ url: 'ws://localhost:3000' }).
Taki hybrydowy transport oznacza, że większość żądań korzysta z wydajnego grupowania HTTP, a subskrypcje z trwałych połączeń WebSocket.
Wywoływanie subskrypcji z React
trpc.notifications.onNew.useSubscription(undefined, { onData: (notification) => addToList(notification), onError: console.error }) subskrybuje procedurę. Funkcja zwrotna onData jest wywoływana dla każdej zwróconej wartości.
Subskrypcja jest automatycznie ustanawiana ponownie po rozłączeniu i ponownym połączeniu WebSocket.
Łączenie zapytań, mutacji i subskrypcji
Rzeczywista strona z listą aktualizowaną w czasie rzeczywistym może używać zapytania do załadowania początkowej listy, mutacji do dodawania elementu oraz subskrypcji do odbierania na bieżąco elementów dodawanych przez innych użytkowników. Wszystkie trzy elementy są typowane względem tego samego AppRouter i naturalnie ze sobą współdziałają.
Strategia unieważniania pamięci podręcznej zależy od tego, czy preferuje się pełne ponowne pobieranie danych (invalidate po mutacji), czy aktualizowanie pamięci podręcznej (utils.post.getAll.setData).
Mutacja tRPC i unieważnianie pamięci podręcznej
Jaką metodą narzędzi tRPC można uruchomić ponowne pobranie zapytania po pomyślnym zakończeniu mutacji?
Podsumowanie lekcji
Zapytania definiuje się za pomocą .query(), a mutacje za pomocą .mutation(); oba rodzaje są sprawdzane przez schematy Zod. Po stronie klienta należy używać trpc.router.procedure.useQuery() i useMutation(). Po mutacji należy unieważniać zapytania za pomocą utils.procedure.invalidate(). Subskrypcje korzystają z generatorów asynchronicznych i wymagają wsLink jako transportu WebSocket.
Domyślnie httpBatchLink łączy równoczesne zapytania w jedno żądanie HTTP.
Często zadawane pytania
Czy lekcja „Queries, mutacje i subskrypcje” jest bezpłatna?
Tak — pełny tekst „Queries, mutacje i subskrypcje” 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 „Queries, mutacje i subskrypcje”?
Używać typowanych queries i mutacji tRPC w komponentach Reacta z pełnym autocomplete i typami błędów Ć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 „Queries, mutacje i subskrypcje”?
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
- Problem rozwiązywany przez tRPC
- Konfiguracja tRPC z Reactem i Next.js
- Queries, mutacje i subskrypcje
- Integracja tRPC z React Query i uwierzytelnianiem