HTML Diff
1 added 1 removed
Original 2026-01-01
Modified 2026-02-26
1 <p><strong>React Router - решение для переключения и маршрутизации страниц React. Библиотека появилась еще в 2014 году и стала одним из первых популярных проектов с открытым исходным кодом на основе React. Рассказываем про ключевую концепцию библиотеки и разбираем, почему разработчики выбирают именно ее для организации маршрутизации. Бонусом - напишем небольшое приложение c использованием хуков useLocation и useNavigate, и увидим, как на практике работает маршрутизация через React Router.</strong></p>
1 <p><strong>React Router - решение для переключения и маршрутизации страниц React. Библиотека появилась еще в 2014 году и стала одним из первых популярных проектов с открытым исходным кодом на основе React. Рассказываем про ключевую концепцию библиотеки и разбираем, почему разработчики выбирают именно ее для организации маршрутизации. Бонусом - напишем небольшое приложение c использованием хуков useLocation и useNavigate, и увидим, как на практике работает маршрутизация через React Router.</strong></p>
2 <blockquote><p>Этот подробный гайд больше подходит для тех, кто уже немного знает основы React. Если вы еще не разобрались с ним, советуем перед прочтением статьи пройти<a>большой курс по React на Хекслете</a>.</p>
2 <blockquote><p>Этот подробный гайд больше подходит для тех, кто уже немного знает основы React. Если вы еще не разобрались с ним, советуем перед прочтением статьи пройти<a>большой курс по React на Хекслете</a>.</p>
3 </blockquote><h2>Содержание</h2>
3 </blockquote><h2>Содержание</h2>
4 <ul><li><a>Декларативная маршрутизация</a></li>
4 <ul><li><a>Декларативная маршрутизация</a></li>
5 <li><a>Подготовка окружения</a></li>
5 <li><a>Подготовка окружения</a></li>
6 <li><a>Настройка маршрутов</a></li>
6 <li><a>Настройка маршрутов</a></li>
7 <li><a>Настройка вложенных маршрутов в React Router v6</a></li>
7 <li><a>Настройка вложенных маршрутов в React Router v6</a></li>
8 <li><a>Хук useLocation</a></li>
8 <li><a>Хук useLocation</a></li>
9 <li><a>Хук useNavigate</a></li>
9 <li><a>Хук useNavigate</a></li>
10 <li><a>Другие хуки</a></li>
10 <li><a>Другие хуки</a></li>
11 </ul><h2>Декларативная маршрутизация</h2>
11 </ul><h2>Декларативная маршрутизация</h2>
12 <p>Декларативная маршрутизация - это стиль кодирования, используемый в React и React Router. Декларативные маршруты React являются компонентами и используют ту же инфраструктуру, что и любое приложение React. Эти маршруты связывают веб-адреса с определенными страницами и другими компонентами, используя мощный механизм рендеринга React и условную логику для программного включения и выключения маршрутов.</p>
12 <p>Декларативная маршрутизация - это стиль кодирования, используемый в React и React Router. Декларативные маршруты React являются компонентами и используют ту же инфраструктуру, что и любое приложение React. Эти маршруты связывают веб-адреса с определенными страницами и другими компонентами, используя мощный механизм рендеринга React и условную логику для программного включения и выключения маршрутов.</p>
13 <p>Конечно, любой маршрутизатор хорош настолько, насколько хороша его библиотека. React Router в шестой версии предоставляет множество мощных функций для упрощения задач маршрутизации и является предпочтительным решением для маршрутизации React.</p>
13 <p>Конечно, любой маршрутизатор хорош настолько, насколько хороша его библиотека. React Router в шестой версии предоставляет множество мощных функций для упрощения задач маршрутизации и является предпочтительным решением для маршрутизации React.</p>
14 <p>Что делает React Router лучшим по сравнению с другими библиотеками маршрутизации:</p>
14 <p>Что делает React Router лучшим по сравнению с другими библиотеками маршрутизации:</p>
15 <ul><li>Декларативное определение маршрута (с использованием JSX внутри компонентов React)</li>
15 <ul><li>Декларативное определение маршрута (с использованием JSX внутри компонентов React)</li>
16 <li>Отраслевой стандарт</li>
16 <li>Отраслевой стандарт</li>
17 <li>Библиотека предлагает множество примеров кода и обширное онлайн-руководство</li>
17 <li>Библиотека предлагает множество примеров кода и обширное онлайн-руководство</li>
18 <li>React Router предоставляет возможность использования хуков и функциональных компонентов.</li>
18 <li>React Router предоставляет возможность использования хуков и функциональных компонентов.</li>
19 </ul><p>Текущая версия React Router v6 внесла ряд ключевых изменений по сравнению с предыдущей версией v5:</p>
19 </ul><p>Текущая версия React Router v6 внесла ряд ключевых изменений по сравнению с предыдущей версией v5:</p>
20 <ul><li>Компонент &lt;Switch&gt; был переименован в &lt;Routes&gt;</li>
20 <ul><li>Компонент &lt;Switch&gt; был переименован в &lt;Routes&gt;</li>
21 <li>Хук useRoutes() заменяет react-router-config для определения маршрутов как простых объектов</li>
21 <li>Хук useRoutes() заменяет react-router-config для определения маршрутов как простых объектов</li>
22 <li>Каждый дочерний компонент &lt;Routes&gt; должен быть &lt;Route&gt;, что может нарушить некоторые предыдущие методы организации и составления маршрутов.</li>
22 <li>Каждый дочерний компонент &lt;Routes&gt; должен быть &lt;Route&gt;, что может нарушить некоторые предыдущие методы организации и составления маршрутов.</li>
23 </ul><p>В нашей статье все примеры будут построены c использованием React Router именно шестой версии.</p>
23 </ul><p>В нашей статье все примеры будут построены c использованием React Router именно шестой версии.</p>
24 <h2>Подготовка окружения</h2>
24 <h2>Подготовка окружения</h2>
25 <p>Прежде чем мы приступим к практике, необходимо подготовить рабочее окружение.</p>
25 <p>Прежде чем мы приступим к практике, необходимо подготовить рабочее окружение.</p>
26 <p>Для создания веб-приложений нам нужен react-router-dom, который включает в себя все, что есть в react-router, и добавляет несколько специфичных для DOM API компонентов, включая &lt;BrowserRouter&gt; и &lt;Link&gt;.</p>
26 <p>Для создания веб-приложений нам нужен react-router-dom, который включает в себя все, что есть в react-router, и добавляет несколько специфичных для DOM API компонентов, включая &lt;BrowserRouter&gt; и &lt;Link&gt;.</p>
27 <p>Создадим проект с помощью Create React App и установим react-router-dom:</p>
27 <p>Создадим проект с помощью Create React App и установим react-router-dom:</p>
28 <p>Кроме того, установим<a>lorem-ipsum</a>для генерации текста-заполнителя lorem ipsum для страниц.</p>
28 <p>Кроме того, установим<a>lorem-ipsum</a>для генерации текста-заполнителя lorem ipsum для страниц.</p>
29 <p>npm i lorem-ipsum</p>
29 <p>npm i lorem-ipsum</p>
30 <p>Теперь пакеты react-router-dom и lorem-ipsum можно увидеть в package.json в качестве зависимостей.</p>
30 <p>Теперь пакеты react-router-dom и lorem-ipsum можно увидеть в package.json в качестве зависимостей.</p>
31 <h2>Настройка маршрутов</h2>
31 <h2>Настройка маршрутов</h2>
32 <p>Router - это компонент верхнего уровня с отслеживанием состояния, который заставляет работать все остальные компоненты навигации и хуки. В React Router есть BrowserRouter, HashRouter, StaticRouter, NativeRouter и MemoryRouter. Для веб-приложений обычно используется BrowserRouter. Приложение должно иметь один &lt;BrowserRouter&gt;, который обертывает один или несколько &lt;Routes&gt;.</p>
32 <p>Router - это компонент верхнего уровня с отслеживанием состояния, который заставляет работать все остальные компоненты навигации и хуки. В React Router есть BrowserRouter, HashRouter, StaticRouter, NativeRouter и MemoryRouter. Для веб-приложений обычно используется BrowserRouter. Приложение должно иметь один &lt;BrowserRouter&gt;, который обертывает один или несколько &lt;Routes&gt;.</p>
33 <p>&lt;Routes&gt; проверяет все свои дочерние элементы &lt;Route&gt;, чтобы найти наилучшее соответствие, и отображает эту часть пользовательского интерфейса.</p>
33 <p>&lt;Routes&gt; проверяет все свои дочерние элементы &lt;Route&gt;, чтобы найти наилучшее соответствие, и отображает эту часть пользовательского интерфейса.</p>
34 - <p>&lt;Route&gt; можно определить либо как оъект, либо элемент Route. Если это объект, он имеет форму { path, element }. Если это элемент Route, компонент имеет вид &lt;Route path element&gt;. Когда указанный путь path соответствует текущему URL-адресу, то отображается компонент, указанный в качестве элемента element. В нашем приложении мы будем использовать именно element.</p>
34 + <p>&lt;Route&gt; можно определить либо как объект, либо элемент Route. Если это объект, он имеет форму { path, element }. Если это элемент Route, компонент имеет вид &lt;Route path element&gt;. Когда указанный путь path соответствует текущему URL-адресу, то отображается компонент, указанный в качестве элемента element. В нашем приложении мы будем использовать именно element.</p>
35 <p>Подготовим несколько страниц, для которых будем настраивать маршрутизацию:</p>
35 <p>Подготовим несколько страниц, для которых будем настраивать маршрутизацию:</p>
36 <p>В src/App.js создадим два маршрута:</p>
36 <p>В src/App.js создадим два маршрута:</p>
37 <p>В этом коде &lt;BrowserRouter&gt; и &lt;Routes&gt; используются для определения маршрутизатора.</p>
37 <p>В этом коде &lt;BrowserRouter&gt; и &lt;Routes&gt; используются для определения маршрутизатора.</p>
38 <p>В приложении есть два &lt;Route&gt;. Когда URL-адрес соответствует пути one, приложение показывает компонент PageOne. Когда URL-адрес соответствует пути two, приложение показывает компонент PageTwo.</p>
38 <p>В приложении есть два &lt;Route&gt;. Когда URL-адрес соответствует пути one, приложение показывает компонент PageOne. Когда URL-адрес соответствует пути two, приложение показывает компонент PageTwo.</p>
39 <p>Запустим приложение, выполнив команду npm start.</p>
39 <p>Запустим приложение, выполнив команду npm start.</p>
40 <p>http://localhost:3000/one показывает PageOne</p>
40 <p>http://localhost:3000/one показывает PageOne</p>
41 <p>http://localhost:3000/two показывает PageTwo</p>
41 <p>http://localhost:3000/two показывает PageTwo</p>
42 <p>Приложение работает для путей one и two. Однако http://localhost:3000 ничего не показывает, как и любые недействительные URL-адреса, такие как http://localhost:3000/anything.</p>
42 <p>Приложение работает для путей one и two. Однако http://localhost:3000 ничего не показывает, как и любые недействительные URL-адреса, такие как http://localhost:3000/anything.</p>
43 <p>Эту проблему можно решить с помощью подстановочного пути:</p>
43 <p>Эту проблему можно решить с помощью подстановочного пути:</p>
44 <p>Теперь http://localhost:3000/two показывает PageTwo. Во всех остальных случаях будет отображаться PageOne. Порядок указания маршрутов не имеет значения, так как React Router 6 выбирает в первую очередь наиболее точное совпадение.</p>
44 <p>Теперь http://localhost:3000/two показывает PageTwo. Во всех остальных случаях будет отображаться PageOne. Порядок указания маршрутов не имеет значения, так как React Router 6 выбирает в первую очередь наиболее точное совпадение.</p>
45 <blockquote><h3>Читайте также:</h3>
45 <blockquote><h3>Читайте также:</h3>
46 <p>Наталия Давыдова, фронтенд-разработчица в "Точке":<a>как мое комьюнити помогает джунам найти работу</a></p>
46 <p>Наталия Давыдова, фронтенд-разработчица в "Точке":<a>как мое комьюнити помогает джунам найти работу</a></p>
47 </blockquote><h2>Настройка вложенных маршрутов в React Router v6</h2>
47 </blockquote><h2>Настройка вложенных маршрутов в React Router v6</h2>
48 <p>Два маршрута в приведенном выше примере работают, как мы и ожидали. Однако вводить URL-адрес в адресной строке браузера неудобно. Мы хотели бы иметь возможность навигации по ссылке, которая называется &lt;Link&gt;.</p>
48 <p>Два маршрута в приведенном выше примере работают, как мы и ожидали. Однако вводить URL-адрес в адресной строке браузера неудобно. Мы хотели бы иметь возможность навигации по ссылке, которая называется &lt;Link&gt;.</p>
49 <p>&lt;Link&gt; отображает доступный элемент &lt;a&gt; с реальным href, указывающим на ресурс, на который он ссылается. Клик по ссылке устанавливает URL-адрес и отслеживает историю просмотров.</p>
49 <p>&lt;Link&gt; отображает доступный элемент &lt;a&gt; с реальным href, указывающим на ресурс, на который он ссылается. Клик по ссылке устанавливает URL-адрес и отслеживает историю просмотров.</p>
50 <p>Создадим главную страницу, которая будет содержать ссылки &lt;Link&gt; на соответствующие страницы src/MainPage.js.</p>
50 <p>Создадим главную страницу, которая будет содержать ссылки &lt;Link&gt; на соответствующие страницы src/MainPage.js.</p>
51 <p>Добавим главную страницу в наше приложение и отметим эту страницу как индексный маршрут, который является дочерним маршрутом без пути.</p>
51 <p>Добавим главную страницу в наше приложение и отметим эту страницу как индексный маршрут, который является дочерним маршрутом без пути.</p>
52 <p>Теперь, когда URL-адрес соответствует "/", приложение будет показывать MainPage: MainPage.</p>
52 <p>Теперь, когда URL-адрес соответствует "/", приложение будет показывать MainPage: MainPage.</p>
53 <p>Нажав на ссылку Page One, мы перейдем на PageOne. Нажав на ссылку Page Two, мы перейдем на PageTwo.</p>
53 <p>Нажав на ссылку Page One, мы перейдем на PageOne. Нажав на ссылку Page Two, мы перейдем на PageTwo.</p>
54 <p>Однако внутри PageOne или PageTwo мы не можем использовать ссылки для навигации. Чтобы решить эту проблему, создадим компонент &lt;Outlet&gt; в MainPage. Он позволяет отображать вложенный пользовательский интерфейс при отображении дочерних маршрутов. Таким образом, при клике на 'one' будет отображаться компонент PageOne, а при клике на 'two' - PageTwo.</p>
54 <p>Однако внутри PageOne или PageTwo мы не можем использовать ссылки для навигации. Чтобы решить эту проблему, создадим компонент &lt;Outlet&gt; в MainPage. Он позволяет отображать вложенный пользовательский интерфейс при отображении дочерних маршрутов. Таким образом, при клике на 'one' будет отображаться компонент PageOne, а при клике на 'two' - PageTwo.</p>
55 <p>Это src/MainPage.js с Outlet:</p>
55 <p>Это src/MainPage.js с Outlet:</p>
56 <p>&lt;Outlet&gt; вызывает вложенные маршруты, где у каждого могут быть свои дочерние маршруты, занимающие часть URL-адреса. Вложенные маршруты обычно описывают через относительные ссылки.</p>
56 <p>&lt;Outlet&gt; вызывает вложенные маршруты, где у каждого могут быть свои дочерние маршруты, занимающие часть URL-адреса. Вложенные маршруты обычно описывают через относительные ссылки.</p>
57 <p>Вот модифицированный src/App.jsx:</p>
57 <p>Вот модифицированный src/App.jsx:</p>
58 <p>http://localhost:3000/ теперь выглядит так:</p>
58 <p>http://localhost:3000/ теперь выглядит так:</p>
59 <p>А так http://localhost:3000/one:</p>
59 <p>А так http://localhost:3000/one:</p>
60 <h2>Хук useLocation</h2>
60 <h2>Хук useLocation</h2>
61 <p>Местоположение - это объект, который представляет местоположение URL. Он основан на объекте браузера window.location.</p>
61 <p>Местоположение - это объект, который представляет местоположение URL. Он основан на объекте браузера window.location.</p>
62 <p>Хук useLocation возвращает объект текущего местоположения.</p>
62 <p>Хук useLocation возвращает объект текущего местоположения.</p>
63 <p>В переменную location мы сохраняем местоположение, которое генерируется хуком useLocation. Внутри хука useEffect мы будем выводить текущее местоположение при каждом изменении параметра location.</p>
63 <p>В переменную location мы сохраняем местоположение, которое генерируется хуком useLocation. Внутри хука useEffect мы будем выводить текущее местоположение при каждом изменении параметра location.</p>
64 <p>Если URL-адрес http://localhost:3000/, то консоль регистрирует:</p>
64 <p>Если URL-адрес http://localhost:3000/, то консоль регистрирует:</p>
65 <p>Current location is {pathname: '/', search: '', hash: '', state: null, key: 'default'}</p>
65 <p>Current location is {pathname: '/', search: '', hash: '', state: null, key: 'default'}</p>
66 <p>Если URL-адрес http://localhost:3000/one, то консоль регистрирует:</p>
66 <p>Если URL-адрес http://localhost:3000/one, то консоль регистрирует:</p>
67 <p>Current location is {pathname: '/one', search: '', hash: '', state: null, key: 'f2114bru'}</p>
67 <p>Current location is {pathname: '/one', search: '', hash: '', state: null, key: 'f2114bru'}</p>
68 <p>Когда URL-адрес http://localhost:3000/anything, то тут консоль регистрирует:</p>
68 <p>Когда URL-адрес http://localhost:3000/anything, то тут консоль регистрирует:</p>
69 <p>Current location is {pathname: '/anything', search: '', hash: '', state: null, key: 'default'}</p>
69 <p>Current location is {pathname: '/anything', search: '', hash: '', state: null, key: 'default'}</p>
70 <h2>Хук useNavigate</h2>
70 <h2>Хук useNavigate</h2>
71 <p>Хук useNavigate возвращает функцию, которую можно использовать для программной навигации. Заменим все &lt;Link&gt; в нашем приложении на &lt;button&gt; в src/MainPage.js:</p>
71 <p>Хук useNavigate возвращает функцию, которую можно использовать для программной навигации. Заменим все &lt;Link&gt; в нашем приложении на &lt;button&gt; в src/MainPage.js:</p>
72 <p>Теперь запустим наше приложение и убедимся, что кнопки работают аналогично ссылкам.</p>
72 <p>Теперь запустим наше приложение и убедимся, что кнопки работают аналогично ссылкам.</p>
73 <p>Хук useNavigate может принимать:</p>
73 <p>Хук useNavigate может принимать:</p>
74 <ol><li>Либо значение To с необязательным вторым аргументом { replace, state }, как это работает и в &lt;Link to&gt;</li>
74 <ol><li>Либо значение To с необязательным вторым аргументом { replace, state }, как это работает и в &lt;Link to&gt;</li>
75 <li>Либо дельта-число, чтобы войти в стек истории. Например, навигация (-1) по своей сути аналогична нажатию кнопки "Назад".</li>
75 <li>Либо дельта-число, чтобы войти в стек истории. Например, навигация (-1) по своей сути аналогична нажатию кнопки "Назад".</li>
76 </ol><h2>Другие хуки</h2>
76 </ol><h2>Другие хуки</h2>
77 <p>Мы показали, как использовать useLocation и useNavigate. При этом в библиотеке есть и другие хуки - например, useParams или useRoutes. С ними можно ознакомиться в официальной документации<a>React Router</a>.</p>
77 <p>Мы показали, как использовать useLocation и useNavigate. При этом в библиотеке есть и другие хуки - например, useParams или useRoutes. С ними можно ознакомиться в официальной документации<a>React Router</a>.</p>
78 <p><em>Статья является адаптированным переводом команды Хекслета материалов из следующих источников:<a>1</a>и<a>2</a>.</em></p>
78 <p><em>Статья является адаптированным переводом команды Хекслета материалов из следующих источников:<a>1</a>и<a>2</a>.</em></p>