В React Router создание пользовательских страниц ошибок позволяет
гибко управлять отображением ошибок маршрутизации, обеспечивая более
дружелюбный и контролируемый интерфейс при возникновении проблем, таких
как неправильные URL, недоступные ресурсы или ошибки загрузки
компонентов. В современных версиях React Router (v6 и выше) основной
подход основан на использовании элемента
или атрибута
errorElement для маршрутов.
Страница ошибки — это обычный React-компонент, который рендерится при
возникновении ошибки на конкретном маршруте. Ключевой момент — этот
компонент получает объект ошибки через хук useRouteError,
что позволяет детально управлять отображением информации о проблеме.
import { useRouteError } from "react-router-dom";
function ErrorPage() {
const error = useRouteError();
console.error(error);
return (
Произошла ошибка
{error.statusText || error.message}
);
}
Пояснение:
useRouteError возвращает объект ошибки маршрута.Для того чтобы маршрут корректно использовал страницу ошибки,
используется свойство errorElement:
import { createBrowserRouter, RouterProvider } from "react-router-dom";
import HomePage from "./HomePage";
import AboutPage from "./AboutPage";
import ErrorPage from "./ErrorPage";
const router = createBrowserRouter([
{
path: "/",
element: ,
errorElement:
},
{
path: "/about",
element: ,
errorElement:
}
]);
function App() {
return ;
}
Ключевые моменты:
errorElement может быть назначен как отдельному
маршруту, так и вложенной группе маршрутов.errorElement.React Router различает несколько типов ошибок:
loader для загрузки данных и запрос возвращает
ошибку.Пример с обработкой загрузки данных через loader:
import { useRouteError } from "react-router-dom";
async function userLoader({ params }) {
const response = await fetch(`/api/users/${params.userId}`);
if (!response.ok) {
throw new Response("Пользователь не найден", { status: 404 });
}
return response.json();
}
const router = createBrowserRouter([
{
path: "/users/:userId",
element: ,
loader: userLoader,
errorElement:
}
]);
Особенности:
Response автоматически передаются в компонент
ошибки.Для вложенных маршрутов можно использовать каскадное определение
страниц ошибок. Если дочерний маршрут вызывает ошибку, React Router ищет
ближайший errorElement в иерархии.
const router = createBrowserRouter([
{
path: "/dashboard",
element: ,
errorElement: ,
children: [
{
path: "settings",
element: ,
errorElement:
}
]
}
]);
Важно:
SettingsPage будет обрабатываться
SettingsErrorPage.SettingsErrorPage отсутствует, то будет показан
DashboardErrorPage.Страницы ошибок могут включать:
404, 500 и т. д.).Пример:
function ErrorPage() {
const error = useRouteError();
return (
);
}
Для улучшения поддержки и анализа приложений ошибки часто отправляются на сервер:
import { useEffect } from "react";
import { useRouteError } from "react-router-dom";
function ErrorPage() {
const error = useRouteError();
useEffect(() => {
fetch("/api/log-error", {
method: "POST",
body: JSON.stringify({ message: error.message, stack: error.stack }),
headers: { "Content-Type": "application/json" }
});
}, [error]);
return (
Произошла ошибка
{error.statusText || error.message}
);
}
Заметки: