В React Router action является ключевым инструментом для
обработки действий, инициируемых пользователем, которые
изменяют состояние приложения, но не связаны напрямую с отображением
маршрута. В отличие от loader, который загружает данные
перед рендерингом маршрута, action используется для
обработки POST-запросов, форм, модификации данных и
других побочных эффектов.
actionКаждый маршрут может иметь свой собственный action:
import { createBrowserRouter, RouterProvider } from "react-router-dom";
import App from "./App";
import { createPostAction } from "./actions";
const router = createBrowserRouter([
{
path: "/posts/new",
element: <App />,
action: createPostAction,
},
]);
function Root() {
return <RouterProvider router={router} />;
}
Здесь createPostAction — это функция, которая будет
вызвана, когда пользователь отправляет данные формы на маршрут
/posts/new.
actionФункция action получает объект с несколькими важными
параметрами:
export async function createPostAction({ request, params }) {
const formData = await request.formData();
const title = formData.get("title");
// Логика создания поста
await savePost({ title });
return redirect("/posts");
}
Ключевые элементы параметров:
request — объект запроса (аналог Request в
Fetch API). Содержит метод, тело запроса, заголовки.params — объект с динамическими сегментами URL
маршрута.context — (необязательный) объект для передачи
дополнительных данных из родительских маршрутов.action может быть асинхронной функцией, что позволяет
выполнять запросы к серверу, сохранять данные в базу, вызывать
API. Пример асинхронного action:
export async function loginAction({ request }) {
const formData = await request.formData();
const email = formData.get("email");
const password = formData.get("password");
const response = await fetch("/api/login", {
method: "POST",
body: JSON.stringify({ email, password }),
headers: { "Content-Type": "application/json" },
});
if (!response.ok) {
return { error: "Неверные данные" };
}
return redirect("/dashboard");
}
Важный момент: action не рендерит компонент
напрямую, а возвращает результат. Этот результат может
быть:
useActionData.redirect.errorElement.action и формReact Router тесно интегрирован с компонентом
<Form>. Любая форма, указывающая маршрут, будет
автоматически вызывать action этого маршрута при
сабмите:
import { Form, useActionData } from "react-router-dom";
export default function NewPost() {
const actionData = useActionData();
return (
<Form method="post">
<input name="title" placeholder="Название поста" />
<button type="submit">Создать</button>
{actionData?.error && <p>{actionData.error}</p>}
</Form>
);
}
Особенности:
method формы (post,
put, delete) соответствует типу запроса,
передаваемого в action.action без перезагрузки страницы.action доступен через хук
useActionData, что упрощает обработку ошибок и отображение
сообщений пользователю.Функция redirect используется для перенаправления после
успешного выполнения действия:
import { redirect } from "react-router-dom";
export async function deletePostAction({ params }) {
await deletePost(params.id);
return redirect("/posts");
}
Это позволяет чисто отделить логику обработки действия от UI, избегая манипуляций с состоянием внутри компонентов.
Если внутри action происходит ошибка, её можно передать
в errorElement маршрута:
export async function riskyAction({ request }) {
try {
// Некоторая логика
} catch (error) {
throw new Response("Ошибка выполнения действия", { status: 500 });
}
}
Маршрут с errorElement:
{
path: "/risky",
element: <RiskyPage />,
action: riskyAction,
errorElement: <ErrorPage />
}
React Router автоматически отобразит компонент
ErrorPage, если action выбросит ошибку.
action маршрута может использовать данные из
родительских маршрутов через context. Это удобно для
многослойных форм или сложных процессов
авторизации:
const router = createBrowserRouter([
{
path: "/dashboard",
element: <DashboardLayout />,
context: { userRole: "admin" },
children: [
{
path: "settings",
element: <Settings />,
action: settingsAction,
}
]
}
]);
Внутри settingsAction можно получить
context.userRole, чтобы проверить права доступа перед
сохранением настроек.
actionaction предназначен для обработки
пользовательских действий, влияющих на состояние
данных.<Form> для
автоматического сабмита.errorElement.action в React Router является фундаментальным
инструментом для построения интерактивных, динамичных и
безопасных форм и маршрутов, где каждый пользовательский ввод
обрабатывается централизованно и предсказуемо.