Серверные действия для мутаций данных
Определяйте функции 'use server' для обработки мутаций форм и аннулируйте кэш с помощью revalidatePath.
«Серверные действия для мутаций данных» — бесплатный урок 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 — локальная установка не требуется.
Все уроки этого курса
- fetch() с параметрами кэширования в Next.js
- unstable_cache и React cache()
- Инкрементальная генерация статических страниц (ISR)
- Серверные действия для мутаций данных