0Pricing
React Academy · Урок

Запросы, мутации и подписки

Используйте типизированные запросы и мутации tRPC в компонентах React с полной автодополняемостью и типами ошибок

«Запросы, мутации и подписки» — бесплатный урок React Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения React Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс React Academy содержит 4 уроков всего.

Определение процедуры запроса

Добавьте .input(zodSchema).query(async ({ input, ctx }) => ...) к publicProcedure. Обработчик получает проверенные входные данные и контекст запроса. Возвращайте любое сериализуемое значение: объект, массив или примитив.

Тип результата выводится автоматически и становится типом данных соответствующего хука useQuery на клиенте.

Вызов запроса из React

trpc.post.getById.useQuery({ id: '1' }) вызывает процедуру getById в маршрутизаторе post. Хук возвращает знакомый объект результата React Query: { data, isLoading, isError, refetch }.

Объект входных данных имеет статический тип: передача { id: 123 }, когда схема ожидает строку, приводит к ошибке TypeScript, обнаруживаемой во время разработки.

Определение процедуры мутации

Используйте .input(zodSchema).mutation(async ({ input, ctx }) => ...) для операций записи на сервере: создания, изменения или удаления данных. Мутации вызываются явно, а не запускаются при монтировании.

Обработчик мутации получает доступ ко всему контексту запроса (включая сеанс из NextAuth) через ctx.

Вызов мутации из React

const { mutate, isLoading, error } = trpc.post.create.useMutation(). Вызовите mutate({ title: 'New', content: '...' }), чтобы запустить мутацию. Как и useMutation из React Query, она не запускается при монтировании.

Передайте обратные вызовы onSuccess и onError в параметры useMutation, чтобы выполнять побочные эффекты после мутации.

Инвалидация кэша после мутации

Чтобы обновить данные запроса после успешной мутации, используйте хук вспомогательных средств tRPC: const utils = trpc.useUtils(). В onSuccess вызовите utils.post.getAll.invalidate(), чтобы запустить повторную загрузку списка публикаций.

Это эквивалент tRPC для queryClient.invalidateQueries() из React Query, использующий ту же схему пометки данных устаревшими и их повторной загрузки.

Проверка входных данных с помощью Zod

По умолчанию tRPC использует Zod для проверки входных данных. Схема Zod выполняется на сервере во время выполнения и отклоняет некорректные входные данные до того, как они попадут в обработчик. Та же схема предоставляет типы TypeScript для клиента.

Эта двойная роль (проверка во время выполнения и типы TypeScript) устраняет дублирование: Вы один раз определяете контракт в Zod и бесплатно получаете обе гарантии безопасности.

Объединение запросов с помощью httpBatchLink

По умолчанию tRPC использует httpBatchLink, который объединяет несколько одновременных запросов tRPC в один HTTP-запрос. Несколько вызовов useQuery в одном цикле отрисовки компонента отправляются и обрабатываются вместе.

Это значительно снижает нагрузку на сеть по сравнению с отдельными HTTP-запросами для каждого запроса на странице, которой требуются несколько наборов данных.

Обзор подписок tRPC

Определите процедуру подписки: publicProcedure.subscription(async function*() { while (true) { yield await nextEvent(); } }). Подписки используют асинхронные генераторы и требуют транспорта WebSocket.

Подписки идеально подходят для функций, работающих в реальном времени: живых уведомлений, курсоров при совместном редактировании или потоковой передачи ответов ИИ.

Настройка транспорта WebSocket

Замените httpBatchLink сочетанием httpBatchLink и wsLink с использованием splitLink: направляйте подписки в wsLink, а запросы и мутации — в httpBatchLink. Создайте клиент WebSocket с помощью createWSClient({ url: 'ws://localhost:3000' }).

Этот комбинированный транспорт означает, что большинство запросов используют эффективное объединение HTTP-запросов, а подписки — постоянные соединения WebSocket.

Вызов подписок из React

trpc.notifications.onNew.useSubscription(undefined, { onData: (notification) => addToList(notification), onError: console.error }) оформляет подписку на процедуру. Обратный вызов onData вызывается для каждого полученного значения.

Если соединение WebSocket разрывается, а затем восстанавливается, подписка автоматически создаётся заново.

Объединение запросов, мутаций и подписок

На странице списка с обновлениями в реальном времени можно использовать запрос для загрузки исходного списка, мутацию для добавления элемента и подписку для получения новых элементов от других пользователей. Все три механизма типизируются через один и тот же AppRouter и естественно сочетаются.

Стратегия инвалидации кэша зависит от того, предпочитаете ли Вы полную повторную загрузку (инвалидация после мутации) или обновление кэша (utils.post.getAll.setData).

Мутация tRPC и инвалидация кэша

Какой вспомогательный метод tRPC запускает повторную загрузку запроса после успешного завершения мутации?

Итоги урока

Определяйте запросы с помощью .query(), а мутации — с помощью .mutation(); и те и другие проверяются схемами Zod. На клиенте используйте trpc.router.procedure.useQuery() и useMutation(). После мутации инвалидируйте запросы с помощью utils.procedure.invalidate(). Подписки используют асинхронные генераторы и требуют wsLink для транспорта WebSocket.

По умолчанию httpBatchLink объединяет одновременные запросы в один HTTP-запрос.

Часто задаваемые вопросы

Урок «Запросы, мутации и подписки» бесплатный?

Да — полный текст урока «Запросы, мутации и подписки» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс React Academy, подпишись на CoddyKit PRO. Курс React Academy содержит 4 уроков всего.

Чему я научусь в уроке «Запросы, мутации и подписки»?

Используйте типизированные запросы и мутации tRPC в компонентах React с полной автодополняемостью и типами ошибок Ты практикуешь React Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать React Academy?

Предыдущий опыт не требуется. React Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.

Сколько времени занимает урок «Запросы, мутации и подписки»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке React Academy?

Да. Каждый урок React Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Какую проблему решает tRPC
  2. Настройка tRPC с React и Next.js
  3. Запросы, мутации и подписки
  4. Интеграция tRPC с React Query и авторизацией
← Назад к React Academy