Источник: Официальный аккаунт «Full Stack Developer»
В этом руководстве давайте рассмотрим, как создавать маршруты с помощью библиотеки React Router v6. Обратите внимание, что на момент написания этой статьи React Router v6 все еще находится в стадии бета-тестирования. В этом руководстве вы познакомитесь с некоторыми новыми функциями, которые появятся в библиотеке.
Если у вас есть опыт маршрутизации в приложениях React, вы, вероятно, уже знаете, что за последние несколько летReach RouterОднако, начиная с версии 6, ему было уделено некоторое внимание, поскольку он был снова объединен с библиотекой React Router. Это означает, что версия v6 имеет меньший размер пакета, чем предыдущая версия, что является одной из основных причин существования Reach Router.
предпосылки
Чтобы получить максимальную отдачу от этого руководства, убедитесь, что в вашей локальной среде разработки установлено следующее.
- Версия Node.js >= 12.x.x
- Менеджер пакетов, такой как npm, yarn или npx.
- Основы JavaScript, React.js и React Hooks
начиная
Начните с создания нового приложения React. Используйте приведенную ниже команду из окна терминала, чтобы создать каталог проекта, затем перейдите в каталог проекта, установите необходимые зависимости и добавьте библиотеку React Router v6.
npx create-react-app react-router-v6-example
cd react-router-v6-example
yarn add history react-router-dom@next
Для удобства я использую codeandbox.io в качестве демонстрации.Для демонстрационного кода, подобного этому, рекомендуется использовать онлайн-инструмент IDE, такой как codeandbox.io
После установки зависимостей откройте в своем любимом редакторе кода.package.json
файл, вы увидитеreact-router-dom
Версия зависимости библиотеки.
“dependencies": {
// 安装的其余依赖项
"react-router-dom": "6.0.0-beta.0",
},
Библиотека React Router различных программных пакетов
Библиотека React Router состоит из трех разных пакетов npm, каждый из которых служит своей цели.
- react-router
- react-router-dom
- react-router-native
Упаковкаreact-router
является основной библиотекой, используемой в качестве одноранговой зависимости для двух других пакетов, перечисленных выше.react-router-dom
— это пакет для маршрутизации в приложениях React. последний пакет в списке,react-router-native
Существуют привязки для разработки приложений React Native.
Теперь, когда у нас это есть, давайте построим наш первый маршрут.
Создайте свой первый маршрут с помощью React Router v6
Чтобы создать свой первый маршрут с помощью библиотеки React Router, откройтеsrc/App.js
файл, добавьте следующий оператор импорта.
import { BrowserRouter as Router } from 'react-router-dom';
Это изreact-router-dom
Первый компонент, импортированный библиотекой. Он используется для переноса различных маршрутов и использует API истории HTML5 для отслеживания истории маршрутов в приложениях React.
во фрагменте вышеRouter
Разделы являются псевдонимами, чтобы упростить запись. Рекомендуется импортировать и использовать его в компоненте верхнего уровня в иерархии компонентов приложения React:
function App() {
return <Router>{/* 所有路由都嵌套在其中 */}</Router>;
}
отreact-router-dom
Следующий импортируемый компонент является новымRoutes
:
import { BrowserRouter as Router, Routes } from 'react-router-dom';
Этот новый элемент является предыдущимSwitch
Обновленная версия компонента, включающая такие функции, как относительная маршрутизация и связывание, автоматическое ранжирование маршрутов, вложенная маршрутизация и компоновка.
нужныйreact-router-dom
Последний компонент в называетсяRoute
, который отвечает за отрисовку пользовательского интерфейса компонента React. оно имеетpath
свойство, которое всегда соответствует текущему URL-адресу приложения. Второй обязательный атрибут называетсяelement
, когда текущий URL-адрес будет обнаружен, он сообщитRoute
Какой компонент React отображать для компонента. здесьelement
Ключевое слово также является новым.Ранее в React Router v5 вы использовали имяcomponent
характеристики.
Чтобы создать первый маршрут в демонстрации ниже, давайте создадим маршрут с именемHome
Базовый функциональный компонент, который возвращает некоторый JSX.
function Home() {
return (
<div style={{ padding: 20 }}>
<h2>Home View</h2>
<p>在React中使用React Router v6 的指南</p>
</div>
);
}
Используйте следующие обновления маршрутизацииApp
функциональные компоненты. Еще одна особенность библиотеки v6, на которую следует обратить внимание, заключается в том, чтоRoute
компонентelement
Теперь свойства позволяют передавать компонент React, а не просто имя этого компонента React. Это упрощает передачу атрибутов маршрутам:
function App() {
return (
<Router>
<Routes>
<Route path="/" element={<Home />} />
</Routes>
</Router>
);
}
Чтобы убедиться, что он работает, вернитесь в окно терминала и используйте командуyarn start
Запустите сервер разработки. Затем перейдите по URL-адресу в окне браузера.http://локальный:3000.
Вот результат после этого шага:
Давайте быстро создадим еще один с именемAbout
Функциональный компонент работает только тогда, когда URL-адрес в окне браузераhttp://localhost:3000/about будет отображаться только.
function About() {
return (
<div style={{ padding: 20 }}>
<h2>About View</h2>
<p>在React中使用React Router v6 的指南</p>
</div>
);
}
Тогда дляAbout
Добавление компонентаRoute
:
<Routes>
<Route path="/" element={<Home />} />
<Route path="/about" element={<About />} />
</Routes>
Теперь вернитесь в окно браузера и перейдите по URL-адресу.http://локальный: 3000/о:
Добавить меню навигации
Чтобы перемещаться по определенному маршруту в приложении React или по двум существующим маршрутам в демонстрационном приложении, давайте начнем сreact-router-dom
изLink
Добавьте минимальную панель навигации с помощью компонентов.
Сначала импортируйте его из библиотеки:
import { BrowserRouter as Router, Routes, Route, Link } from 'react-router-dom';
Концепция навигации между различными веб-страницами в HTML основана на использовании тегов привязки:
<a href="">Some Link Name</a>
Использование этого метода в приложении React вызовет веб-страницу при отображении нового представления или самой страницы. Чтобы не обновлять веб-страницу,react-router-dom
библиотека предоставляетLink
компоненты.
Далее, вApp
Внутри функционального компонента создайте панель навигации, как показано во фрагменте кода:
<Router>
<nav style={{ margin: 10 }}>
<Link to="/" style={{ padding: 5 }}>
Home
</Link>
<Link to="/about" style={{ padding: 5 }}>
About
</Link>
</nav>
{/* 其余代码保持不变 */}
</Router>
Перейдите в окно браузера, чтобы увидеть панель навигации в действии:
Как работать с вложенным маршрутом
Вложенная маршрутизация — важная концепция для понимания. При вложенности маршрутов обычно считается, что определенная часть веб-страницы остается неизменной, а меняются только подразделы веб-страницы.
Например, если вы посещаете простой блог, то всегда отображается заголовок блога, а под ним отображается список постов блога. Однако, когда вы нажимаете на сообщение в блоге, список сообщений в блоге заменяется содержанием или описанием этого конкретного сообщения в блоге. Вот пример, который будет выполнен в этом разделе, чтобы понять, как обрабатываются вложенные маршруты в последней версии библиотеки React Router.
В React Router v5 вложенные маршруты должны были быть определены явно, чего нет в React Router v6. Он подбирает библиотеку с именемOutlet
, визуализируя любые соответствующие дочерние элементы для определенного маршрута. Во-первых, изreact-router-dom
импортировать из библиотекиOutlet
:
import { Outlet } from 'react-router-dom';
Чтобы имитировать базовое ведение блога, мыApp.js
Добавьте некоторые фиктивные данные в файл. Этот фрагмент кода содержитBlogPosts
Объект, который дополнительно содержит различные объекты в качестве свойств. Каждый объект состоит из трех частей:
- уникальный идентификатор
- название статьи
- Описание статьи
const BlogPosts = {
'1': {
title: 'First Blog Post',
description: 'Lorem ipsum dolor sit amet, consectetur adip.'
},
'2': {
title: 'Second Blog Post',
description: 'Hello React Router v6'
}
};
Этот уникальный фрагмент будет использоваться в URL-адресе веб-браузера для просмотра содержимого каждого сообщения. Далее создайте файл с именемPosts
Функциональный компонент, отображающий список всех сообщений блога:
function Posts() {
return (
<div style={{ padding: 20 }}>
<h2>Blog</h2>
{/* 渲染任何匹配的子级 */}
<Outlet />
</div>
);
}
Определите другого имениPostLists
компонент, всякий раз, когда щелкают URL-адрес в окне браузераhttp://localhost:3000/posts отобразится список всех сообщений. давайте использовать javascript Object.entry()
метод из объектаBlogPosts
возвращает массив, который будет отображаться для отображения списка заголовков для всех сообщений в блоге:
function PostLists() {
return (
<ul>
{Object.entries(BlogPosts).map(([slug, { title }]) => (
<li key={slug}>
<h3>{title}</h3>
</li>
))}
</ul>
);
}
ИсправлятьApp
Маршрут в функциональном компоненте, например:
<Routes>
{/* 其余代码保持不变 */}
<Route path="posts" element={<Posts />}>
<Route path="/" element={<PostLists />} />
</Route>
</Routes>
Это показывает, что всякий раз, когда URL запускаетсяhttp://localhost:3000/posts отобразит список сообщений блога, поэтому компонент PostsLists
:
Как получить доступ к параметрам URL и динамическим параметрам маршрутов
Чтобы получить доступ к отдельным статьям, щелкнув заголовки статей в отображаемом списке статей блога, все, что вам нужно сделать, это обернуть заголовок каждой статьи вPostsLists
в компонентеLink
внутри компонента. Затем используйтеslug
Определение каждого префикса пути прохождения бумаги/posts/
Путь статьи в браузере согласуется.
<ul>
{Object.entries(BlogPosts).map(([slug, { title }]) => (
<li key={slug}>
<Link to={`/posts/${slug}`}>
<h3>{title}</h3>
</Link>
</li>
))}
</ul>
Далее, изreact-router-dom
импортировать библиотеку с именемuseParams
крюк. С помощью этого хука вы можете получить доступ к любым динамическим параметрам, которые может иметь конкретный маршрут (или слаг). каждыйslug
Динамические параметры будут для каждого поста в блогеtitle
а такжеdescription
. Необходимость доступа к ним заключается в отображении содержимого каждого сообщения в блоге, когда определенный сегмент сообщения в блоге запускается как URL-адрес в окне браузера:
import { useParams } from 'react-router-dom';
СоздатьPost
новый функциональный компонент, который будет загружаться изuseParams
Хук, чтобы получить текущую статью. Используя синтаксис записи квадратных скобок в JavaScript, новыйpost
Переменная, содержащая значение свойства или текущее содержимое сообщения в блоге.
function Post() {
const BlogPosts = {
"1": {
title: "第一篇博客文章",
description: "第一篇博客文章,是关于Vue3.0的"
},
"2": {
title: "第二篇博客文章",
description: "Hello React Router v6"
}
};
const { slug } = useParams();
const post = BlogPosts[slug];
const { title, description } = post;
return (
<div style={{ padding: 20 }}>
<h3>{title}</h3>
<p>{description}</p>
</div>
);
}
Наконец, вApp
Добавьте функцию с именем:slug
динамическая маршрутизация для отображения содержимого каждой статьи:
// 其余代码保持不变
<Route path="posts" element={<Posts />}>
<Route path="/" element={<PostLists />} />
<Route path=":slug" element={<Post />} />
</Route>
Вот полный вывод после этого шага:
Суммировать
Если вы впервые изучаете React Router, надеюсь, эта статья станет для вас хорошим введением. Если вы уже знакомы с любой из предыдущих версий этой библиотеки маршрутизации, я надеюсь, что эта статья дала вам представление о том, что изменилось между предыдущей и последней версией.
Получите полный код для этого случая
- Кодыпесочнице:код sandbox.io/yes/lucid-adult…
- Гитхаб:GitHub.com/read-you-prepare/code…
Связанное Чтение
- Демистификация React useEffect
- 5 вещей, которые начинающие разработчики React могут сделать неправильно
- Синтаксис React.js и Vue.js рядом
Эта статья была впервые опубликована на официальном аккаунте «Front-end Full-Stack Developer» ID: by-zhangbing-dev, прочитайте последние статьи как можно скорее и отдайте приоритет публикации новых статей через два дня. Обратив внимание, ответьте, пожалуйста, личным письмом: Большая подарочная упаковка, отправка по сети качественных видеокурсов онлайн с информацией о дисках, безусловно, сэкономит вам много денег!