React Academy · Урок

Серверные действия для мутаций данных

Определяйте функции 'use server' для обработки мутаций форм и аннулируйте кэш с помощью revalidatePath.

Урок 4 из 412 шагов

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

Что такое серверные действия

Серверные действия — это асинхронные функции с пометкой 'use server', которые выполняются исключительно на сервере. Они позволяют отправлять формы и изменять данные без написания обработчиков маршрутов API.

Определение серверного действия

Добавьте 'use server' в начало функции (или файла), чтобы создать серверное действие. Его можно определить только в серверных компонентах или в отдельных файлах actions.ts.

// app/actions.ts
'use server';

import { revalidatePath } from 'next/cache';
import { redirect } from 'next/navigation';

export async function createPost(formData: FormData) {
  const title = formData.get('title') as string;
  await db.post.create({ data: { title } });
  revalidatePath('/blog');
  redirect('/blog');
}

Использование действий в формах

Передайте функцию действия в свойство action формы. Не нужны ни onSubmit, ни обработчик событий — Next.js сериализует форму и вызывает действие на сервере.

import { createPost } from './actions';

export default function NewPostForm() {
  return (
    <form action={createPost}>
      <input name="title" placeholder="Post title" required />
      <button type="submit">Create</button>
    </form>
  );
}

Хук useActionState

useActionState (React 19) оборачивает действие, отслеживает состояние выполнения и получает возвращаемое действием значение в компоненте.

'use client';
import { useActionState } from 'react';
import { createPost } from './actions';

const initialState = { error: null };

export function PostForm() {
  const [state, action, isPending] = useActionState(createPost, initialState);
  return (
    <form action={action}>
      {state.error && <p className="error">{state.error}</p>}
      <input name="title" />
      <button disabled={isPending}>{isPending ? 'Creating...' : 'Create'}</button>
    </form>
  );
}

Возврат ошибок валидации

Возвращайте из действия объект вместо выбрасывания ошибки, чтобы передать ошибки валидации обратно в форму через useActionState.

export async function createPost(prevState: any, formData: FormData) {
  'use server';
  const title = formData.get('title') as string;
  if (!title || title.length < 3) {
    return { error: 'Title must be at least 3 characters' };
  }
  await db.post.create({ data: { title } });
  revalidatePath('/blog');
  redirect('/blog');
}

Серверные действия в обработчиках событий

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

'use client';
import { deletePost } from './actions';

export function DeleteButton({ id }: { id: string }) {
  return (
    <button onClick={() => deletePost(id)}>
      Delete
    </button>
  );
}

Встроенные серверные действия

Определяйте серверные действия непосредственно в серверном компоненте с помощью функции, содержащей внутри себя 'use server' — это удобно для логики изменения данных, расположенной рядом с её использованием.

export default function PostPage({ post }) {
  async function updatePost(formData: FormData) {
    'use server';
    await db.post.update({ where: { id: post.id }, data: { title: formData.get('title') as string } });
    revalidatePath(`/blog/${post.id}`);
  }

  return (
    <form action={updatePost}>
      <input name="title" defaultValue={post.title} />
      <button type="submit">Save</button>
    </form>
  );
}

useOptimistic с серверными действиями

Сочетайте useOptimistic с серверными действиями, чтобы мгновенно обновлять интерфейс, пока действие выполняется в фоновом режиме.

'use client';
import { useOptimistic } from 'react';
import { addItem } from './actions';

export function TodoList({ items }) {
  const [optimisticItems, addOptimistic] = useOptimistic(items, (state, newItem) => [...state, newItem]);
  return (
    <form action={async (formData) => {
      addOptimistic({ id: 'temp', text: formData.get('text') });
      await addItem(formData);
    }}>
      <ul>{optimisticItems.map(i => <li key={i.id}>{i.text}</li>)}</ul>
      <input name="text" /><button>Add</button>
    </form>
  );
}

Вопросы безопасности

Серверные действия работают как конечные точки POST. Всегда проверяйте и очищайте входные данные на сервере, проверяйте аутентификацию и используйте защиту CSRF (Next.js автоматически обрабатывает её для запросов из того же источника).

Обновление после изменений данных

Вызовите revalidatePath() или revalidateTag() после изменения данных, чтобы очистить соответствующие кэши и отразить изменение при следующей загрузке страницы.

Быстрая проверка

Как передать серверное действие форме в маршрутизаторе приложения Next.js?

Повторение

Серверные действия — это асинхронные функции 'use server', которые обрабатывают изменения данных на сервере. Подключайте их к формам через свойство action, отслеживайте состояние с помощью useActionState, возвращайте ошибки вместо выбрасывания исключений при валидации и обновляйте кэши после изменений данных.

Можно начать бесплатно

Изучай React с ИИ-репетитором — бесплатно

Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.

Курсы
88
Уроки
324

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

Урок «Серверные действия для мутаций данных» бесплатный?

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

Чему я научусь в уроке «Серверные действия для мутаций данных»?

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

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

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

Сколько времени занимает урок «Серверные действия для мутаций данных»?

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

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

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

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

  1. fetch() с параметрами кэширования в Next.js
  2. unstable_cache и React cache()
  3. Инкрементальная генерация статических страниц (ISR)
  4. Серверные действия для мутаций данных
← Назад к React Academy