React Router предоставляет мощный инструмент для организации
навигации в приложениях на React. Ключевым элементом является компонент
<BrowserRouter>, который оборачивает всё приложение и
обеспечивает работу истории браузера. Внутри него располагаются
маршруты, определяемые с помощью <Routes> и
<Route>:
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>
);
}
Каждый маршрут связывает URL с компонентом. Параметры маршрута,
например :userId, доступны через хук
useParams(), позволяющий динамически получать значения из
URL.
Идентификация устаревших маршрутов
Перед миграцией необходимо определить компоненты, которые используют
устаревший способ маршрутизации, например
react-router-dom v5 с <Switch> и
history.push(). Эти конструкции заменяются на
<Routes> и useNavigate().
Обновление корневого роутера
<BrowserRouter> остаётся базовым элементом, но
внутренние маршруты следует переписать с учётом новой структуры:
<Switch> заменяется на
<Routes>.component в <Route> заменяется на
element с JSX.<Route> внутри родительского
<Route>.Пример вложенной маршрутизации:
<Routes>
<Route path="/dashboard" element={<Dashboard />}>
<Route path="analytics" element={<Analytics />} />
<Route path="settings" element={<Settings />} />
</Route>
</Routes>
Переход на хуки навигации
Методы класса this.props.history.push() заменяются на
хук useNavigate():
import { useNavigate } from 'react-router-dom';
function LoginButton() {
const navigate = useNavigate();
const handleLogin = () => {
// логика авторизации
navigate('/dashboard');
};
return <button onCl ick={handleLogin}>Войти</button>;
}
В React Router v6 введено упрощённое управление динамическими
маршрутами. Использование useParams() позволяет получить
параметры URL:
import { useParams } from 'react-router-dom';
function Profile() {
const { userId } = useParams();
return <div>Профиль пользователя: {userId}</div>;
}
Для сложных приложений рекомендуется использовать вложенные маршруты
с Outlet. Outlet выступает как контейнер для
рендеринга дочерних маршрутов внутри родительского компонента:
import { Outlet } from 'react-router-dom';
function Dashboard() {
return (
<div>
<h2>Панель управления</h2>
<Outlet />
</div>
);
}
Редиректы в новой версии реализуются с помощью
<Navigate>:
import { Navigate } from 'react-router-dom';
function PrivateRoute({ isAuthenticated, children }) {
return isAuthenticated ? children : <Navigate to="/login" replace />;
}
replace предотвращает запись текущего URL в историю
браузера, что важно для корректной навигации после авторизации или
выхода из системы.
Для больших приложений важна оптимизация загрузки компонентов. React
Router поддерживает ленивый импорт с помощью React.lazy и
Suspense:
import { lazy, Suspense } from 'react';
import { Routes, Route } from 'react-router-dom';
const Home = lazy(() => import('./Home'));
const About = lazy(() => import('./About'));
function App() {
return (
<Suspense fallback={<div>Загрузка...</div>}>
<Routes>
<Route path="/" element={<Home />} />
<Route path="/about" element={<About />} />
</Routes>
</Suspense>
);
}
Это снижает время начальной загрузки и позволяет подгружать компоненты только при необходимости.
Для синхронизации состояния URL с внутренними данными компонентов применяются хуки:
useLocation() — получение текущего пути и
состояния.useSearchParams() — работа с query-параметрами.useNavigate() — программная навигация.Пример работы с query-параметрами:
import { useSearchParams } from 'react-router-dom';
function Filter() {
const [searchParams, setSearchParams] = useSearchParams();
const category = searchParams.get('category');
const handleChange = (newCategory) => {
setSearchParams({ category: newCategory });
};
return (
<div>
<p>Текущая категория: {category}</p>
<button onCl ick={() => handleChange('books')}>Книги</button>
</div>
);
}
react-router-dom, обновление зависимостей.<Switch> на <Routes>, с
component на element.useNavigate, использование useParams,
useLocation.React.lazy и Suspense.Такая стратегия позволяет минимизировать риск ошибок и обеспечивает плавный переход на новую архитектуру маршрутизации без полной перестройки проекта.