React Router предоставляет гибкий механизм для работы с
маршрутизацией в React-приложениях, особенно когда требуется организация
вложенных маршрутов. Важной частью построения маршрутов
является понимание и правильное использование компонентов
Outlet, Routes, Route и
Link.
Routes и RouteRoutes — это контейнер для всех маршрутов приложения. Он
обрабатывает URL и рендерит соответствующие компоненты. Каждый маршрут
описывается компонентом Route.
import { Routes, Route } from "react-router-dom";
import Home from "./Home";
import About from "./About";
import Dashboard from "./Dashboard";
<Routes>
<Route path="/" element={<Home />} />
<Route path="/about" element={<About />} />
<Route path="/dashboard/*" element={<Dashboard />} />
</Routes>
Ключевые моменты:
path определяет путь URL.element задает компонент, который будет рендериться при
совпадении пути.* в конце
пути родительского маршрута. Это сигнализирует React Router, что в
данном маршруте возможны дочерние маршруты.OutletOutlet — компонент, который выступает
плейсхолдером для дочерних маршрутов. Он необходим при
построении вложенной структуры маршрутов.
Пример организации вложенных маршрутов:
import { Outlet, Link } from "react-router-dom";
function Dashboard() {
return (
<div>
<h1>Dashboard</h1>
<nav>
<Link to="stats">Статистика</Link>
<Link to="settings">Настройки</Link>
</nav>
<Outlet />
</div>
);
}
Здесь Outlet определяет место, где будут рендериться
дочерние маршруты stats и settings. Без
Outlet дочерние маршруты не будут отображаться.
Вложенные маршруты задаются внутри родительского Route
через дочерние Route.
<Routes>
<Route path="/dashboard/*" element={<Dashboard />}>
<Route path="stats" element={<Stats />} />
<Route path="settings" element={<Settings />} />
</Route>
</Routes>
Особенности:
stats вместо
/dashboard/stats).Outlet, чтобы
дочерние компоненты рендерились корректно.Для навигации внутри приложения используется компонент
Link. При работе с вложенными маршрутами путь указывается
относительно текущего родительского маршрута:
<Link to="stats">Перейти к статистике</Link>
Если требуется абсолютный путь, можно использовать слэш в начале:
<Link to="/dashboard/settings">Настройки</Link>
React Router позволяет создавать маршруты с динамическими сегментами. Это полезно для отображения страниц с идентификаторами или категориями.
<Route path="users/:userId" element={<UserProfile />} />
Доступ к параметрам маршрута осуществляется через хук
useParams:
import { useParams } from "react-router-dom";
function UserProfile() {
const { userId } = useParams();
return <div>Профиль пользователя {userId}</div>;
}
Важно учитывать: при вложенной структуре маршрутов
useParams возвращает все параметры от текущего маршрута и
всех родителей.
Index маршруты — это маршруты, которые рендерятся по умолчанию при совпадении родительского пути.
<Route path="/dashboard/*" element={<Dashboard />}>
<Route index element={<Stats />} />
<Route path="settings" element={<Settings />} />
</Route>
В данном примере при переходе на /dashboard
автоматически рендерится компонент Stats.
Для перехода между маршрутами программно используется хук
useNavigate.
import { useNavigate } from "react-router-dom";
function Dashboard() {
const navigate = useNavigate();
const goToSettings = () => {
navigate("settings");
};
return <button onCl ick={goToSettings}>Перейти к настройкам</button>;
}
Особенности:
settings) или абсолютным
(/dashboard/settings).state:
navigate("settings", { state: { fromDashboard: true } }).Outlet с Layout-компонентамиДля организации сложных приложений полезно создавать Layout-компоненты, которые содержат общие элементы интерфейса, например, шапку, боковое меню или футер.
function AppLayout() {
return (
<div>
<header>Header</header>
<main>
<Outlet />
</main>
<footer>Footer</footer>
</div>
);
}
<Routes>
<Route path="/" element={<AppLayout />}>
<Route index element={<Home />} />
<Route path="about" element={<About />} />
<Route path="dashboard/*" element={<Dashboard />} />
</Route>
</Routes>
Преимущество такого подхода — повторное использование интерфейсных компонентов без дублирования кода.
* в конце пути родительского маршрута для
поддержки всех вложенных путей.useParams для корректного получения данных.Эти компоненты и подходы создают фундамент для построения масштабируемой и удобной вложенной маршрутизации в React-приложениях.