React Router — это библиотека для управления маршрутизацией в приложениях на React. Она позволяет создавать динамическую навигацию между различными компонентами без перезагрузки страницы. Главная задача маршрутизатора — отображать определённые компоненты в зависимости от URL, сохраняя при этом состояние приложения и обеспечивая плавный пользовательский опыт.
Маршрутизация в React Router строится вокруг трёх ключевых
концепций: Routes, Route и
Link.
Routes — контейнер, который объединяет
несколько маршрутов и определяет, какой из них будет активен в текущий
момент.Route — определяет соответствие между
URL и компонентом. Каждому маршруту задаётся путь path и
компонент element, который должен отобразиться.Link — компонент для создания
навигации. Он заменяет стандартные HTML-теги <a> и
обеспечивает переход без перезагрузки страницы.import { BrowserRouter as Router, Routes, Route, Link } from 'react-router-dom';
import Home from './Home';
import About from './About';
function App() {
return (
<Router>
<nav>
<Link to="/">Главная</Link>
<Link to="/about">О нас</Link>
</nav>
<Routes>
<Route path="/" element={<Home />} />
<Route path="/about" element={<About />} />
</Routes>
</Router>
);
}
React Router поддерживает несколько типов маршрутов, каждый из которых имеет свои особенности:
Статические маршруты Соответствие происходит по
фиксированному пути. Например, /about или
/contact.
Динамические маршруты Используются параметры в
пути с двоеточием :. Параметры можно получить через хук
useParams.
<Route path="/user/:id" element={<UserProfile />} />
import { useParams } from 'react-router-dom';
function UserProfile() {
const { id } = useParams();
return <div>Профиль пользователя {id}</div>;
}
<Route path="/dashboard" element={<Dashboard />}>
<Route path="stats" element={<Stats />} />
<Route path="settings" element={<Settings />} />
</Route>
Вложенные маршруты отображаются с использованием компонента
<Outlet />.
Link и NavLink позволяют
создавать ссылки. Основное отличие NavLink — возможность
автоматического добавления CSS-класса для активного маршрута.
<NavLink to="/about" className={({ isActive }) => isActive ? 'active' : ''}>
О нас
</NavLink>
Для программной навигации используется хук
useNavigate:
import { useNavigate } from 'react-router-dom';
function HomeButton() {
const navigate = useNavigate();
return <button onCl ick={() => navigate('/home')}>На главную</button>;
}
React Router позволяет реализовать приватные маршруты, доступные
только авторизованным пользователям. Основная техника — создание обёртки
PrivateRoute:
function PrivateRoute({ children, isAuthenticated }) {
return isAuthenticated ? children : <Navigate to="/login" />;
}
// Использование
<Route path="/profile" element={<PrivateRoute isAuthenticated={userLoggedIn}><Profile /></PrivateRoute>} />
Для простого перенаправления используется компонент
Navigate.
React Router поддерживает передачу состояния между маршрутами через
объект state в Link и
useNavigate.
<Link to="/details" state={{ from: 'homepage' }}>Подробнее</Link>
import { useLocation } from 'react-router-dom';
function Details() {
const location = useLocation();
return <div>Перешли со страницы: {location.state.from}</div>;
}
Это позволяет передавать данные без использования глобального состояния или query-параметров.
useParams — получение параметров из
URL.useNavigate — программная
навигация.useLocation — получение текущего URL и
состояния.useMatch — проверка, совпадает ли
текущий URL с заданным маршрутом.useOutletContext — передача данных
между родительским и вложенными маршрутами.<Routes> вместо устаревшего
<Switch>. <Routes> ищет
первое совпадение и рендерит только его.<Route path="*" element={<NotFound />} />
<Route path="/dashboard" element={<Dashboard />}>
<Route index element={<DashboardHome />} />
</Route>
Для оптимизации приложения маршруты могут загружать компоненты
динамически через React.lazy и Suspense:
import { Suspense, lazy } from 'react';
const About = lazy(() => import('./About'));
<Routes>
<Route path="/about" element={
<Suspense fallback={<div>Загрузка...</div>}>
<About />
</Suspense>
} />
</Routes>
Это позволяет уменьшить размер основного бандла и ускорить загрузку приложения.
React Router предоставляет мощный инструмент для организации навигации, позволяя строить как простые, так и сложные многоуровневые SPA, управлять доступом, передавать состояние и оптимизировать загрузку компонентов. Правильное использование его концепций — ключ к созданию гибких и масштабируемых React-приложений.