React Router — установка и маршрутизация

Кратко
Краткое практическое руководство по установке и использованию React Router v6 для одностраничных приложений (SPA). Покрыты установка, базовые и вложенные маршруты, компоненты Link и NavLink, а также советы по отладке и деплою.
Введение
Single Page Application (SPA) — это веб-сайт или веб-приложение, которое динамически заменяет содержимое страницы без полной перезагрузки. В React-приложениях компоненты получают данные и отрисовывают их в одном HTML-файле.
React Router — библиотека для управления маршрутами (URL) внутри SPA. Она позволяет отображать нужный компонент по URL, организовывать вложенные маршруты, навигацию и работать с параметрами пути.
Определение терминов (в одну строку каждое):
- SPA: веб-приложение, где навигация не вызывает полной перезагрузки страницы.
- Маршрут: соответствие между URL и компонентом, который должен отобразиться.
- Outlet: компонент, служащий «плейсхолдером» для дочерних маршрутов.
Когда использовать React Router
Важно использовать React Router, если приложение:
- требует управления URL (закладок, прямых ссылок);
- имеет разные экраны/страницы с уникальными адресами;
- должен поддерживать историю браузера и ссылочную навигацию.
Не нужен React Router, если приложение — чистый виджет без адресации или если навигация реализуется вне React.
Как установить React Router
Установите пакет react-router-dom v6 (рекомендуемая стабильная ветка для большинства проектов). В корне проекта запустите одну из команд:
npm i react-router-domили
yarn add react-router-dom@6Совет: фиксируйте мажорную версию в package.json, чтобы избежать несовместимости при автоматическом обновлении.
Настройка BrowserRouter
Откройте файл index.js (или index.jsx) и оберните корневой компонент в BrowserRouter, чтобы весь дерево компонентов могло пользоваться маршрутизатором:
import React from 'react';
import ReactDOM from 'react-dom/client';
import App from './App';
import { BrowserRouter } from 'react-router-dom';
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
);BrowserRouter использует History API браузера. Для проектов, где нужно поддерживать старые сервера или статическую доставку, рассмотрите HashRouter (использует хеш # в URL).
Простой пример маршрутов
Создадим маршруты Home, About и Blog внутри App:
import { Routes, Route } from 'react-router-dom';
import Home from './Home';
import About from './About';
import Blog from './Blog';
function App() {
return (
} />
} />
} />
);
}
export default App;Пояснения:
- Routes — контейнер для Route.
- Route принимает path (путь) и element (компонент для рендера).
- Путь ‘/‘ — корневой маршрут, обычно рендерит главную страницу.
Навигация: Link и NavLink
Для навигации используйте компонент Link вместо обычной ссылки , чтобы предотвратить перезагрузку страницы:
import { Link } from 'react-router-dom';
function Home() {
return (
О нас
Блог
Это главная страница
);
}
export default Home;NavLink — похож на Link, но позволяет стилизовать активную ссылку (например, добавить класс active):
import { NavLink } from 'react-router-dom';
isActive ? 'active' : ''}>Блог Вложенные маршруты и Outlet
React Router поддерживает вложенные маршруты, когда несколько маршрутов логически принадлежат одному разделу. Для этого используют компонент Outlet в родительском компоненте.
Пример структуры:
- /article (список)
- /article/new (форма создания)
- /article/1 (страница статьи)
Компонент маршрутов можно организовать так:
import { Routes, Route } from 'react-router-dom';
import Articles from './Articles';
import NewArticle from './NewArticle';
import ArticleOne from './ArticleOne';
function App() {
return (
} />
} />
} />
);
}
export default App;Обратите внимание на относительные пути дочерних маршрутов: внутри родителя путь ‘new’ соответствует ‘/article/new’. Для рендера дочерних компонентов используйте Outlet в компоненте-лейауте:
import { Outlet } from 'react-router-dom';
function ArticleLayout() {
return (
Статьи
);
}Затем в маршрутизации указывайте элемент родителя, если нужен общий компонент-обёртка:
}>
} />
} />
} />
Параметры пути и хук useParams
Чтобы объявить параметр маршрута, используйте двоеточие в пути, затем читайте его через useParams:
// маршрут
} />
// компонент
import { useParams } from 'react-router-dom';
function Article() {
const { id } = useParams();
// id — строка из URL, например '1'
return Статья #{id};
}useParams возвращает объект со строковыми значениями параметров.
Программная навигация useNavigate
Для перехода по коду (например, после отправки формы) используйте useNavigate:
import { useNavigate } from 'react-router-dom';
function Form() {
const navigate = useNavigate();
const onSubmit = () => {
// логика сохранения
navigate('/article'); // переход к списку статей
};
return ;
}navigate поддерживает относительные переходы и замену записи истории (replace: true).
Маршруты по шаблону и «звёздочка»
Для группы маршрутов используйте символ-джокер ‘*’, чтобы матчить всё, что начинается с префикса:
} /> Это полезно при выносe большого набора маршрутов в отдельную компоненту.
Типичные ошибки и как их исправить
- Проблема: при обновлении страницы по URL 404 на сервере. Решение: сервер должен отдавать index.html для всех путей (на static-хостингах — настройка fallback / rewrites).
- Проблема: ссылки перезагружают страницу. Решение: используйте Link, а не для внутренних переходов.
- Проблема: относительные пути неправильно работают. Решение: проверьте, где используется slash — для дочернего маршрута внутри родителя используйте относительный путь без ведущего ‘/‘.
Советы по отладке
- Включите строгое сравнение путей и проверяйте, что Routes содержит только Route; вложенные Routes не должны дублировать путь родителя с начальным ‘/‘.
- Логи: console.log(useParams(), location) помогают понять, какие значения попадают в маршруты.
Развёртывание и настройка сервера
Для SPA важно, чтобы сервер возвращал index.html для всех URL, которые обрабатывает React Router. Примеры:
- Nginx: настройка try_files -> index.html
- Netlify/Vercel/Surge: настроить правила перенаправления (redirects/rewrites)
Если используется BrowserRouter, серверный fallback обязателен. В качестве обходного решения для простых страниц можно использовать HashRouter, который не требует серверных правил, но портит URL (#).
Контрольный список разработчика
- Установлен react-router-dom нужной версии.
- BrowserRouter оборачивает приложение.
- Routes и Route настроены без конфликтов путей.
- Link/NavLink используются для навигации.
- Для вложенных маршрутов реализован Outlet.
- Настроены перезаписи на сервере для SPA (если используется BrowserRouter).
Критерии приёмки
- По корневому пути ‘/‘ отобразился компонент Home.
- Переход по Link не вызывает полной перезагрузки страницы.
- Вложенные маршруты отображаются внутри Outlet родителя.
- Навигация работает при прямом вводе URL и при перезагрузке страницы.
Альтернативные подходы
- Для простых приложений без URL-адресов можно обойтись локальным состоянием и условной отрисовкой.
- HashRouter — быстрый путь избежать серверных настроек, но URL содержит ‘#’.
- Роутинг на уровне сервера (SSR) — для SEO и первичной загрузки стоит рассмотреть Next.js или Remix.
Ментальная модель (упрощённо)
Представьте дерево компонентов как карту: Routes — это узлы маршрутов, Route — указатель на конкретное место на карте, Outlet — дверь в следующий уровень карты.
Быстрый чек для QA
- Проверить работу Back/Forward в браузере.
- Проверить глубокую ссылку (ввести URL вручную).
- Проверить поведение при неверном URL (404 или редирект).
- Проверить активный стиль NavLink.
Пример playbook для добавления новой группы маршрутов
- Создать папку и компоненты: List, Detail, New.
- Создать файл маршрутов ArticleRoutes.js с вложенными Route.
- Добавить
} /> в App. - Добавить Outlet и тесты навигации.
- Проверить перезагрузку страницы и работу Back/Forward.
Модель риска и смягчение
- Риск: 404 после деплоя. Смягчение: тестировать прямые URL на стейдже и настраивать серверные rewrites.
- Риск: несовместимость версий. Смягчение: фиксировать мажорную версию и читать changelog.
Итог
React Router — гибкий инструмент для маршрутизации в React SPA. Правильная установка BrowserRouter, грамотная организация Routes/Route и использование Link/NavLink, Outlet, useParams и useNavigate позволяют создать предсказуемую навигацию. Не забывайте про серверную конфигурацию при использовании BrowserRouter.