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>Компонент <Switch> был переименован в <Routes></li>
20
<ul><li>Компонент <Switch> был переименован в <Routes></li>
21
<li>Хук useRoutes() заменяет react-router-config для определения маршрутов как простых объектов</li>
21
<li>Хук useRoutes() заменяет react-router-config для определения маршрутов как простых объектов</li>
22
<li>Каждый дочерний компонент <Routes> должен быть <Route>, что может нарушить некоторые предыдущие методы организации и составления маршрутов.</li>
22
<li>Каждый дочерний компонент <Routes> должен быть <Route>, что может нарушить некоторые предыдущие методы организации и составления маршрутов.</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 компонентов, включая <BrowserRouter> и <Link>.</p>
26
<p>Для создания веб-приложений нам нужен react-router-dom, который включает в себя все, что есть в react-router, и добавляет несколько специфичных для DOM API компонентов, включая <BrowserRouter> и <Link>.</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. Приложение должно иметь один <BrowserRouter>, который обертывает один или несколько <Routes>.</p>
32
<p>Router - это компонент верхнего уровня с отслеживанием состояния, который заставляет работать все остальные компоненты навигации и хуки. В React Router есть BrowserRouter, HashRouter, StaticRouter, NativeRouter и MemoryRouter. Для веб-приложений обычно используется BrowserRouter. Приложение должно иметь один <BrowserRouter>, который обертывает один или несколько <Routes>.</p>
33
<p><Routes> проверяет все свои дочерние элементы <Route>, чтобы найти наилучшее соответствие, и отображает эту часть пользовательского интерфейса.</p>
33
<p><Routes> проверяет все свои дочерние элементы <Route>, чтобы найти наилучшее соответствие, и отображает эту часть пользовательского интерфейса.</p>
34
-
<p><Route> можно определить либо как о��ъект, либо элемент Route. Если это объект, он имеет форму { path, element }. Если это элемент Route, компонент имеет вид <Route path element>. Когда указанный путь path соответствует текущему URL-адресу, то отображается компонент, указанный в качестве элемента element. В нашем приложении мы будем использовать именно element.</p>
34
+
<p><Route> можно определить либо как объект, либо элемент Route. Если это объект, он имеет форму { path, element }. Если это элемент Route, компонент имеет вид <Route path element>. Когда указанный путь 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>В этом коде <BrowserRouter> и <Routes> используются для определения маршрутизатора.</p>
37
<p>В этом коде <BrowserRouter> и <Routes> используются для определения маршрутизатора.</p>
38
<p>В приложении есть два <Route>. Когда URL-адрес соответствует пути one, приложение показывает компонент PageOne. Когда URL-адрес соответствует пути two, приложение показывает компонент PageTwo.</p>
38
<p>В приложении есть два <Route>. Когда 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-адрес в адресной строке браузера неудобно. Мы хотели бы иметь возможность навигации по ссылке, которая называется <Link>.</p>
48
<p>Два маршрута в приведенном выше примере работают, как мы и ожидали. Однако вводить URL-адрес в адресной строке браузера неудобно. Мы хотели бы иметь возможность навигации по ссылке, которая называется <Link>.</p>
49
<p><Link> отображает доступный элемент <a> с реальным href, указывающим на ресурс, на который он ссылается. Клик по ссылке устанавливает URL-адрес и отслеживает историю просмотров.</p>
49
<p><Link> отображает доступный элемент <a> с реальным href, указывающим на ресурс, на который он ссылается. Клик по ссылке устанавливает URL-адрес и отслеживает историю просмотров.</p>
50
<p>Создадим главную страницу, которая будет содержать ссылки <Link> на соответствующие страницы src/MainPage.js.</p>
50
<p>Создадим главную страницу, которая будет содержать ссылки <Link> на соответствующие страницы 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 мы не можем использовать ссылки для навигации. Чтобы решить эту проблему, создадим компонент <Outlet> в MainPage. Он позволяет отображать вложенный пользовательский интерфейс при отображении дочерних маршрутов. Таким образом, при клике на 'one' будет отображаться компонент PageOne, а при клике на 'two' - PageTwo.</p>
54
<p>Однако внутри PageOne или PageTwo мы не можем использовать ссылки для навигации. Чтобы решить эту проблему, создадим компонент <Outlet> в MainPage. Он позволяет отображать вложенный пользовательский интерфейс при отображении дочерних маршрутов. Таким образом, при клике на 'one' будет отображаться компонент PageOne, а при клике на 'two' - PageTwo.</p>
55
<p>Это src/MainPage.js с Outlet:</p>
55
<p>Это src/MainPage.js с Outlet:</p>
56
<p><Outlet> вызывает вложенные маршруты, где у каждого могут быть свои дочерние маршруты, занимающие часть URL-адреса. Вложенные маршруты обычно описывают через относительные ссылки.</p>
56
<p><Outlet> вызывает вложенные маршруты, где у каждого могут быть свои дочерние маршруты, занимающие часть 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 возвращает функцию, которую можно использовать для программной навигации. Заменим все <Link> в нашем приложении на <button> в src/MainPage.js:</p>
71
<p>Хук useNavigate возвращает функцию, которую можно использовать для программной навигации. Заменим все <Link> в нашем приложении на <button> в src/MainPage.js:</p>
72
<p>Теперь запустим наше приложение и убедимся, что кнопки работают аналогично ссылкам.</p>
72
<p>Теперь запустим наше приложение и убедимся, что кнопки работают аналогично ссылкам.</p>
73
<p>Хук useNavigate может принимать:</p>
73
<p>Хук useNavigate может принимать:</p>
74
<ol><li>Либо значение To с необязательным вторым аргументом { replace, state }, как это работает и в <Link to></li>
74
<ol><li>Либо значение To с необязательным вторым аргументом { replace, state }, как это работает и в <Link to></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>