Основы React Router v6
▸Что нового в v6
React Router v6 — это полный пересмотр API. Основные изменения: компонентный подход заменен хуками, упрощена конфигурация маршрутов, добавлена вложенная маршрутизация по умолчанию.
▸Установка и настройка
1npm install react-router-dom
1import { BrowserRouter, Routes, Route } from 'react-router-dom';23function App() {4 return (5 <BrowserRouter>6 <Routes>7 <Route path="/" element={<Home />} />8 <Route path="/about" element={<About />} />9 </Routes>10 </BrowserRouter>11 );12}
Конфигурация маршрутов
▸Базовые маршруты
Каждый Route принимает path и element. Элемент — это React-компонент, который отрисовывается при совпадении пути.
▸Динамические параметры
Используйте : для динамических сегментов пути:
1<Route path="/users/:userId" element={<UserProfile />} />23// Доступ к параметрам4function UserProfile() {5 const { userId } = useParams();6 return <div>User: {userId}</div>;7}
▸Catch-all маршруты
1<Route path="/docs/*" element={<Documentation />} />23// Внутри Documentation4function Documentation() {5 const { '*': path } = useParams();6 return <div>Текущий раздел: {path}</div>;7}
Вложенная маршрутизация
▸Layout Routes
Вложенные маршруты позволяют переиспользовать layouts:
1<Route path="/dashboard" element={<DashboardLayout />}>2 <Route index element={<DashboardHome />} />3 <Route path="settings" element={<Settings />} />4 <Route path="profile" element={<Profile />} />5</Route>
▸Outlet для рендеринга дочерних маршрутов
1function DashboardLayout() {2 return (3 <div>4 <Sidebar />5 <main>6 <Outlet />7 </main>8 </div>9 );10}
Навигация
▸Компонент Link
1import { Link, NavLink } from 'react-router-dom';23function Navigation() {4 return (5 <nav>6 <Link to="/">Главная</Link>7 <NavLink8 to="/about"9 className={({ isActive }) =>10 isActive ? 'active' : 'inactive'11 }12 >13 О нас14 </NavLink>15 </nav>16 );17}
▸Программная навигация
1import { useNavigate } from 'react-router-dom';23function LoginPage() {4 const navigate = useNavigate();56 const handleLogin = async () => {7 await login();8 navigate('/dashboard');9 };1011 return <button onClick={handleLogin}>Войти</button>;12}
Guards и защита маршрутов
▸RequireAuth паттерн
1function RequireAuth({ children }) {2 const { isAuthenticated } = useAuth();3 const location = useLocation();45 if (!isAuthenticated) {6 return <Navigate to="/login" state={{ from: location }} />;7 }89 return children;10}1112// Использование13<Route14 path="/dashboard"15 element={16 <RequireAuth>17 <Dashboard />18 </RequireAuth>19 }20/>
▸Lazy Loading маршрутов
1const Dashboard = lazy(() => import('./Dashboard'));23<Route4 path="/dashboard"5 element={6 <Suspense fallback={<Spinner />}>7 <Dashboard />8 </Suspense>9 }10/>
Обработка ошибок
▸ErrorBoundary для маршрутов
1import { ErrorBoundary } from 'react-error-boundary';23function RouteErrorBoundary() {4 return (5 <ErrorBoundary6 fallbackRender={({ error, resetErrorBoundary }) => (7 <div>8 <h1>Ошибка</h1>9 <p>{error.message}</p>10 <button onClick={resetErrorBoundary}>Попробовать снова</button>11 </div>12 )}13 >14 <Outlet />15 </ErrorBoundary>16 );17}
▸ErrorElement в Route
1<Route2 path="/users/:userId"3 element={<UserProfile />}4 errorElement={<UserError />}5/>
Продвинутые паттерны
▸Route prefixes
1// Все маршруты с префиксом /api2const apiRoutes = [3 { path: '/users', element: <Users /> },4 { path: '/posts', element: <Posts /> },5];67<Route path="/api" element={<ApiLayout />}>8 {apiRoutes.map(route => (9 <Route key={route.path} {...route} />10 ))}11</Route>
▸Кастомные хуки для навигации
1function useQueryParams() {2 const [searchParams, setSearchParams] = useSearchParams();34 const getParam = (key) => searchParams.get(key);56 const setParam = (key, value) => {7 setSearchParams(prev => {8 prev.set(key, value);9 return prev;10 });11 };1213 return { getParam, setParam };14}
Заключение
React Router v6 предоставляет декларативную и гибкую систему навигации. Вложенные маршруты, хуки и компонентный подход делают код чище и проще. Используйте lazy loading для оптимизации, guards для защиты маршрутов и ErrorBoundary для обработки ошибок.