React Router — это библиотека для управления навигацией в приложениях
на React. Она позволяет создавать динамические маршруты, управлять
историей браузера и реализовывать условный рендеринг компонентов в
зависимости от URL. Основные элементы библиотеки — это
BrowserRouter, Routes, Route,
Link, Navigate и Outlet.
Маршруты задаются с помощью компонента <Route>
внутри <Routes>:
import { BrowserRouter, Routes, Route } from 'react-router-dom';
import Home from './Home';
import About from './About';
import Profile from './Profile';
function App() {
return (
<BrowserRouter>
<Routes>
<Route path="/" element={<Home />} />
<Route path="/about" element={<About />} />
<Route path="/profile/:userId" element={<Profile />} />
</Routes>
</BrowserRouter>
);
}
path задает путь маршрута.element — компонент, который будет отрендерен при
совпадении URL.:userId) позволяют
использовать параметры URL в компоненте через хук
useParams.Для организации сложных приложений используют вложенные маршруты:
<Route path="/dashboard" element={<Dashboard />}>
<Route path="stats" element={<Stats />} />
<Route path="settings" element={<Settings />} />
</Route>
Outlet в компоненте Dashboard указывает
место, где будут рендериться дочерние маршруты:
import { Outlet } from 'react-router-dom';
function Dashboard() {
return (
<div>
<h1>Dashboard</h1>
<Outlet />
</div>
);
}
Для навигации используют компонент Link:
<Link to="/about">О нас</Link>
Для программного перенаправления применяется хук
useNavigate:
import { useNavigate } from 'react-router-dom';
function Home() {
const navigate = useNavigate();
const goToProfile = () => navigate('/profile/123');
return <button onCl ick={goToProfile}>Перейти в профиль</button>;
}
import { useParams } from 'react-router-dom';
function Profile() {
const { userId } = useParams();
return <div>Пользователь: {userId}</div>;
}
import { useLocation } from 'react-router-dom';
function Page() {
const location = useLocation();
console.log(location.pathname, location.state);
}
import { useSearchParams } from 'react-router-dom';
function Search() {
const [searchParams, setSearchParams] = useSearchParams();
const query = searchParams.get('q');
return <div>Поиск: {query}</div>;
}
Для ограничения доступа к определенным маршрутам используют условный
рендеринг с Navigate:
function ProtectedRoute({ isAuth, children }) {
return isAuth ? children : <Navigate to="/login" />;
}
Использование:
<Route
path="/profile"
element={
<ProtectedRoute isAuth={userLoggedIn}>
<Profile />
</ProtectedRoute>
}
/>
Для повышения производительности рекомендуется использовать ленивую
загрузку компонентов с React.lazy и
Suspense:
import { lazy, Suspense } from 'react';
const About = lazy(() => import('./About'));
<Route
path="/about"
element={
<Suspense fallback={<div>Загрузка...</div>}>
<About />
</Suspense>
}
/>
React Router предоставляет мощный и гибкий инструмент для построения навигации в приложениях React, обеспечивая динамические маршруты, защиту контента, управление параметрами URL и оптимизацию загрузки компонентов.