У режимі даних маршрут описується об'єктом, до якого прив'язані завантажувач (loader) для читання й дія (action) для змін.
import { createBrowserRouter, RouterProvider, useLoaderData, Form, useNavigation } from 'react-router';
const router = createBrowserRouter([
{
path: '/projects/:projectId',
Component: Project,
loader: async ({ params }) => api.getProject(params.projectId),
action: async ({ request, params }) => {
const formData = await request.formData();
return api.updateProject(params.projectId, { title: formData.get('title') });
},
},
]);
function Project() {
const project = useLoaderData();
const navigation = useNavigation();
return (
<Form method="post">
<input name="title" defaultValue={project.title} />
<button disabled={navigation.state === 'submitting'}>Зберегти</button>
</Form>
);
}
Завантажувачі:
- виконуються до рендеру сторінки - компонент отримує готові дані, без станів «завантаження» в
useEffect; - для вкладених маршрутів завантажуються паралельно, а не водоспадом батько → дитина;
- помилка в завантажувачі показує
ErrorBoundaryмаршруту.
Дії:
- викликаються через
<Form method="post">,useSubmitабоfetcher; - після дії всі завантажувачі сторінки перевантажуються автоматично - інтерфейс синхронізований з сервером без ручного оновлення стану;
<Form>створює навігацію (новий запис в історії), аuseFetcher- відправляє без навігації: лайки, позначки «прочитано», дії в рядках таблиці.
Стан очікування: useNavigation() (для навігації й форм) і fetcher.state (для фетчерів) - idle, loading, submitting.
У React Router 8 middleware маршрутів увімкнено завжди: спільна логіка (перевірка автентифікації, контекст) виконується до завантажувачів і дій.
Порівняно з Inertia + Laravel: ідея близька - дані «належать» маршруту, а після мутації сторінка оновлюється. Різниця в тому, що в React Router завантажувачі працюють у браузері (і звертаються до API), а в Inertia ту саму роль виконує контролер Laravel на сервері.
Пастка: дія в режимі даних виконується в браузері - це не серверний код. Валідація й авторизація все одно мають бути в API, куди вона звертається.