Запросы, мутации и подписки
Используйте типизированные запросы и мутации 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 — локальная установка не требуется.
Все уроки этого курса
- Какую проблему решает tRPC
- Настройка tRPC с React и Next.js
- Запросы, мутации и подписки
- Интеграция tRPC с React Query и авторизацией