В библиотеке React Router для управления навигацией в приложении
используется хук useNavigate,
предоставляющий программный способ перехода между маршрутами без
необходимости использовать компоненты <Link> или
<NavLink>. Он особенно полезен для редиректов после
действий пользователя, таких как отправка формы или успешное выполнение
асинхронного запроса.
Для начала необходимо импортировать хук из библиотеки:
import { useNavigate } from 'react-router-dom';
useNavigate возвращает функцию навигации:
const navigate = useNavigate();
Эта функция позволяет переходить к указанному маршруту:
navigate('/home');
По умолчанию переход выполняется замещением текущего маршрута, добавляя новую запись в историю браузера. Для замены текущей страницы вместо добавления новой записи можно использовать объект с параметрами:
navigate('/login', { replace: true });
replace: true — заменяет текущую
запись в истории вместо добавления новой, что удобно для перенаправлений
после логина или выхода.useNavigate поддерживает передачу состояния между
маршрутами через объект state:
navigate('/profile', { state: { fromDashboard: true } });
На целевой странице состояние можно получить с помощью хука
useLocation:
import { useLocation } from 'react-router-dom';
const location = useLocation();
console.log(location.state.fromDashboard); // true
Это позволяет передавать данные между страницами без использования глобального состояния или query-параметров.
Программная навигация легко сочетается с динамическими маршрутами. Если маршрут объявлен с параметром:
<Route path="/user/:id" element={<UserProfile />} />
Переход к конкретному пользователю выполняется так:
navigate(`/user/${userId}`);
Для комплексных случаев с query-параметрами можно использовать шаблон
URL и конкатенацию строк или URLSearchParams:
const params = new URLSearchParams({ tab: 'settings' });
navigate(`/user/${userId}?${params.toString()}`);
Хук useNavigate часто используется в
функциях-обработчиках событий:
const handleSubmit = async (data) => {
const success = await sendFormData(data);
if (success) {
navigate('/success');
} else {
navigate('/error', { replace: true });
}
};
Такой подход обеспечивает гибкий контроль над навигацией в зависимости от результата действий пользователя.
useNavigate
работает только внутри функциональных компонентов или хуков. Для
навигации вне React-компонента используется альтернативный подход с
объектом navigate через контекст маршрутизатора или
createBrowserHistory.navigate после завершения асинхронных операций, чтобы
избежать перехода до получения данных.replace и
state: параметры навигации можно
комбинировать:navigate('/dashboard', { replace: true, state: { fromLogin: true } });
1. Редирект после авторизации:
const Login = () => {
const navigate = useNavigate();
const handleLogin = () => {
authenticateUser().then(() => {
navigate('/dashboard', { replace: true });
});
};
return <button onCl ick={handleLogin}>Login</button>;
};
2. Переход с сохранением состояния:
const Cart = () => {
const navigate = useNavigate();
const checkout = () => {
navigate('/checkout', { state: { cartItems: items } });
};
return <button onCl ick={checkout}>Checkout</button>;
};
3. Навигация с возвратом к предыдущей странице:
const navigate = useNavigate();
const goBack = () => {
navigate(-1); // эквивалент browser back
};
const goForward = () => {
navigate(1); // эквивалент browser forward
};
navigate поддерживает отрицательные и положительные
числовые аргументы для управления историей браузера, что расширяет
возможности программной навигации.
useNavigate возвращает функцию для программной
навигации.replace, передачу
state и работу с динамическими
маршрутами.-1, 1).