В React Router (v6) существует несколько способов передачи параметров через URL. Рассмотрим основные подходы с примерами.
Самый распространенный способ передачи обязательных параметров.
<Route path="/products/:id" element={<ProductPage />} />
Где :id
- динамический параметр
import { useParams } from 'react-router-dom';
function ProductPage() {
const { id } = useParams(); // Деструктуризация параметра
return <div>Товар ID: {id}</div>;
}
/products/123
→ id = "123"
Для необязательных параметров (после знака ?)
<Link to="/search?query=react&page=1">Поиск</Link>
или программно:
navigate('/search?query=react&page=1');
import { useSearchParams } from 'react-router-dom';
function SearchPage() {
const [searchParams, setSearchParams] = useSearchParams();
const query = searchParams.get('query');
const page = searchParams.get('page') || 1; // Значение по умолчанию
return (
<div>
Поиск: {query}, Страница: {page}
</div>
);
}
/search?query=react&page=1
→ query = "react", page = "1"
Для передачи сложных объектов без отображения в URL
<Link
to="/user"
state={{
fromDashboard: true,
userData: { name: 'Alex' }
}}
>
Профиль
</Link>
import { useLocation } from 'react-router-dom';
function UserPage() {
const location = useLocation();
const { fromDashboard, userData } = location.state || {};
return (
<div>
{fromDashboard && <p>Переход из дашборда</p>}
{userData?.name && <p>Привет, {userData.name}</p>}
</div>
);
}
Можно сочетать несколько способов:
// Маршрут
<Route path="/category/:categoryId" element={<CategoryPage />} />
// Навигация
navigate(`/category/${id}?sort=price`, {
state: { from: 'homepage' }
});
// В компоненте
function CategoryPage() {
const { categoryId } = useParams();
const [searchParams] = useSearchParams();
const { state } = useLocation();
const sort = searchParams.get('sort');
const from = state?.from;
}
Типы параметров:
Обновление параметров:
setSearchParams
Восстановление состояния:
:id
) - для обязательных идентификаторов, получаем через useParams
?key=value
) - для фильтров/настроек, работаем через useSearchParams
useLocation
Выбор способа зависит от задачи: