React Router предоставляет мощный механизм для организации навигации в приложениях на React. Одним из ключевых аспектов является возможность передачи состояния (state) между страницами или компонентами при переходе. Это позволяет избегать глобального состояния для временных данных и обеспечивает удобный способ передачи информации между маршрутами.
state в компоненте <Link>Компонент <Link> позволяет задать не только путь,
но и объект state, который будет доступен на целевом
маршруте. Пример базового использования:
import { Link } from 'react-router-dom';
function Home() {
const user = { id: 1, name: 'Alice' };
return (
<div>
<h1>Главная страница</h1>
<Link
to="/profile"
state={{ user }}
>
Перейти к профилю
</Link>
</div>
);
}
Здесь объект user передается в маршрут
/profile. Этот объект не отображается в URL, что удобно для
передачи чувствительных данных или временной информации.
state в целевом компонентеДля извлечения переданного состояния используется хук
useLocation из react-router-dom:
import { useLocation } from 'react-router-dom';
function Profile() {
const location = useLocation();
const { user } = location.state || {};
return (
<div>
<h1>Профиль пользователя</h1>
{user ? (
<p>Имя: {user.name}</p>
) : (
<p>Данные пользователя отсутствуют</p>
)}
</div>
);
}
Важно проверять наличие state, так как при прямом
переходе по URL объект может отсутствовать.
state через хук useNavigateДля программной навигации и передачи состояния используется хук
useNavigate:
import { useNavigate } from 'react-router-dom';
function Dashboard() {
const navigate = useNavigate();
const goToProfile = () => {
navigate('/profile', { state: { user: { id: 2, name: 'Bob' } } });
};
return <button onCl ick={goToProfile}>Профиль</button>;
}
Второй аргумент функции navigate — объект опций, среди
которых ключ state позволяет передавать любые данные. Это
особенно полезно при редиректах после действий пользователя, например,
после формы или авторизации.
Данные, переданные через state, не сохраняются
при перезагрузке страницы, так как они хранятся в истории
браузера, а не в URL или локальном хранилище. Если требуется сохранение
между обновлениями страницы, необходимо использовать
localStorage, sessionStorage или глобальное
состояние через Redux/Context API.
Передача данных после формы После успешного заполнения формы можно передать результат в другой компонент без необходимости сохранять данные глобально.
Временные фильтры и настройки Для фильтров таблиц или настроек интерфейса можно передавать состояние между страницами без загромождения URL.
Контекстное перенаправление Например, после авторизации передать информацию о только что вошедшем пользователе на страницу профиля.
location.state для
безопасного доступа к переданным данным.Пример типизации:
interface LocationState {
user: { id: number; name: string };
}
const location = useLocation() as { state: LocationState };
const { user } = location.state;
Link или navigate.Передача состояния через state в React Router — это
легкий и удобный способ обмена данными между маршрутами без
необходимости глобального состояния или сериализации данных в URL. Этот
механизм хорошо подходит для временной информации, действий пользователя
и контекстных переходов, обеспечивая чистую и гибкую архитектуру
приложения.