Маршрутизация как источник истины

React Router — это библиотека для управления маршрутизацией в приложениях на React. Она позволяет создавать динамическую навигацию, связывать URL с компонентами и управлять состоянием приложения через адресную строку браузера. В React Router маршрутизация рассматривается как единственный источник истины, где состояние интерфейса синхронизируется с URL.

Ключевой принцип: состояние интерфейса должно полностью отражаться в маршрутах. Любое изменение, которое не синхронизировано с URL, считается потенциальной причиной ошибок и трудной отладки.


Основные компоненты

Оборачивает приложение и обеспечивает работу истории браузера. Использует HTML5 History API для управления адресной строкой.

import { BrowserRouter } from 'react-router-dom';

function App() {
  return (
    
      
        {/* маршруты */}
      
    
  );
}

и

Компонент содержит набор , которые определяют соответствие между URL и компонентом.

import { Routes, Route } from 'react-router-dom';
import Home from './Home';
import About from './About';

function AppRoutes() {
  return (
    
      } />
      } />
    
  );
}

Особенности:

  • path — путь маршрута, поддерживает динамические параметры.
  • element — компонент, который рендерится при совпадении пути.
  • выбирает первый совпавший маршрут, поэтому порядок маршрутов важен.

Динамические маршруты

Для передачи параметров в URL используются двоеточия:

} />

В компоненте UserProfile параметры можно получить через хук useParams:

import { useParams } from 'react-router-dom';

function UserProfile() {
  const { userId } = useParams();
  return 
Профиль пользователя: {userId}
; }

Особенности динамических маршрутов:

  • Параметры всегда возвращаются как строки.
  • Возможна комбинация динамических и статических сегментов URL.
  • Поддерживаются необязательные параметры и “wildcard” (*) для вложенных маршрутов.

Вложенные маршруты

Вложенные маршруты позволяют строить иерархическую структуру страниц. Родительский компонент рендерит дочерние маршруты с помощью :

import { Outlet } from 'react-router-dom';

function Dashboard() {
  return (
    

Панель управления

); } }> } /> } />

Особенности вложенности:

  • URL дочернего маршрута строится относительно родителя.
  • определяет, где рендерятся дочерние маршруты.
  • Вложенность может быть произвольной, что удобно для построения сложных интерфейсов.

Навигация

Для перехода между маршрутами используется или хук useNavigate:

import { Link, useNavigate } from 'react-router-dom';

function Menu() {
  const navigate = useNavigate();

  return (
    
Главная
); }

Различия:


Состояние маршрута и URL

React Router использует URL как источник истины. Любое состояние, которое должно быть сохранено в истории браузера, должно отражаться в маршрутах:

navigate('/products?page=2&filter=popular');

Состояние можно получить через useLocation:

import { useLocation } from 'react-router-dom';

function Products() {
  const location = useLocation();
  console.log(location.search); // ?page=2&filter=popular
}

Рекомендации по состоянию маршрута:

  • Избегать хранения критического UI-состояния вне URL.
  • Использовать query-параметры для фильтров, пагинации и сортировки.
  • Обеспечивать возможность копирования ссылки с сохранением состояния интерфейса.

Защищённые маршруты

Для маршрутов, доступных только авторизованным пользователям, применяют концепцию Protected Routes:

function ProtectedRoute({ isAuth, children }) {
  if (!isAuth) {
    return ;
  }
  return children;
}


  
      
    
  } />

Особенности:

  • выполняет редирект без перезагрузки страницы.
  • Использование replace предотвращает попадание защищённого маршрута в историю браузера.
  • Логика проверки состояния и редиректов должна оставаться простой и централизованной.

Ленивая загрузка компонентов

Для оптимизации крупных приложений используется динамический импорт компонентов через React.lazy и Suspense:

import { Suspense, lazy } from 'react';
const About = lazy(() => import('./About'));

Загрузка...
}> } />

Преимущества:

  • Снижается время начальной загрузки.
  • Маршруты загружаются только при необходимости.
  • Удобно комбинировать с вложенной маршрутизацией.

Обработка ошибок маршрутизации

React Router поддерживает отлавливание несуществующих маршрутов через path="*":

} />

Рекомендации:

  • Размещать wildcard-маршрут в конце списка .
  • Использовать для отображения пользовательской страницы 404 или редиректа на главную.
  • Можно комбинировать с динамическими редиректами в зависимости от состояния пользователя.

Работа с хранилищем истории

useNavigate и useLocation позволяют полностью управлять историей:

  • navigate(path, { replace: true }) — замена текущего маршрута.
  • navigate(-1) — переход на предыдущую страницу.
  • navigate(1) — переход на следующую страницу.

Совет: синхронизация состояния UI с историей браузера делает приложение предсказуемым и легко тестируемым.