В React Router параметры маршрутов позволяют
динамически передавать значения через URL и использовать их для
рендеринга соответствующих компонентов. Параметры задаются с помощью
двоеточия (:) в пути маршрута и могут быть извлечены с
помощью хуков или компонентов библиотеки.
Для объявления параметра в маршруте используется синтаксис
:имяПараметра. Например:
import { BrowserRouter as Router, Routes, Route } from 'react-router-dom';
import UserProfile from './UserProfile';
function App() {
return (
<Router>
<Routes>
<Route path="/user/:userId" element={<UserProfile />} />
</Routes>
</Router>
);
}
В этом примере :userId — это параметр маршрута, который
будет содержать значение из URL, например /user/42.
useParamsДля доступа к значениям параметров используется хук
useParams, который возвращает объект с ключами,
соответствующими именам параметров:
import { useParams } from 'react-router-dom';
function UserProfile() {
const { userId } = useParams();
return <div>Профиль пользователя с ID: {userId}</div>;
}
Если URL равен /user/42, то userId будет
равен "42".
Маршрут может содержать несколько параметров:
<Route path="/user/:userId/post/:postId" element={<Post />} />
В компоненте Post можно получить оба значения:
const { userId, postId } = useParams();
Это позволяет строить маршруты с вложенной структурой и динамическими данными.
React Router версии 6 поддерживает параметры с опциональным
значением, используя синтаксис ?:
<Route path="/products/:categoryId?" element={<ProductList />} />
Если URL /products не содержит параметра,
categoryId будет undefined. Это удобно для
построения универсальных маршрутов, обрабатывающих несколько
вариантов.
Параметры маршрутов часто применяются для запроса данных с сервера. Например, при загрузке профиля пользователя:
import { useEffect, useState } from 'react';
import { useParams } from 'react-router-dom';
function UserProfile() {
const { userId } = useParams();
const [user, setUser] = useState(null);
useEffect(() => {
fetch(`/api/users/${userId}`)
.then(response => response.json())
.then(data => setUser(data));
}, [userId]);
if (!user) return <div>Загрузка...</div>;
return <div>Имя пользователя: {user.name}</div>;
}
Вложенные маршруты могут использовать параметры верхнего уровня. Например:
<Route path="/user/:userId" element={<User />}>
<Route path="posts/:postId" element={<UserPost />} />
</Route>
В UserPost можно получить оба параметра:
const { userId, postId } = useParams();
Это обеспечивает гибкость при построении комплексных приложений с несколькими уровнями вложенности.
Можно задавать регулярные выражения для параметров, чтобы ограничить
допустимые значения. В React Router 6 используется простой синтаксис
через компонент <Route>:
<Route path="/order/:orderId(\d+)" element={<OrderDetails />} />
В этом случае orderId будет соответствовать только
числовым значениям. URL /order/abc не будет совпадать с
маршрутом.
Параметры можно указывать в ссылках с помощью компонента
Link или хука useNavigate:
import { Link } from 'react-router-dom';
<Link to={`/user/${user.id}`}>Перейти к профилю</Link>
Используя useNavigate для программной навигации:
import { useNavigate } from 'react-router-dom';
const navigate = useNavigate();
navigate(`/user/${userId}`);
Для приложений с большим числом динамических страниц полезно создавать маршруты на основе данных:
const routes = users.map(user => (
<Route key={user.id} path={`/user/${user.id}`} element={<UserProfile />} />
));
Это позволяет избегать дублирования кода и облегчает поддержку маршрутов.
Параметры маршрутов — основной инструмент для создания динамических
страниц. Использование useParams, вложенных маршрутов и
опциональных параметров обеспечивает гибкую навигацию и возможность
интеграции с серверными данными, что делает React Router мощным
инструментом для построения одностраничных приложений.