useNavigationType — это хук, предоставляемый
библиотекой React Router, который позволяет определить, каким образом
произошло перемещение между маршрутами. Он возвращает одно из значений:
"POP", "PUSH" или "REPLACE", что
позволяет реагировать на различные сценарии навигации в приложении.
POP Указывает, что переход был вызван действиями истории браузера, например кнопками «Назад» или «Вперед». Этот тип навигации не изменяет историю явно через код, а является результатом встроенных возможностей браузера.
PUSH Отражает переход, инициированный через
навигацию программно с добавлением нового элемента в стек истории.
Обычно вызывается через <Link> или функцию
navigate("/path") без параметра
replace.
REPLACE Указывает на замену текущего элемента
истории без добавления нового. Этот тип навигации возникает при вызове
navigate("/path", { replace: true }), что полезно для
редиректов или обновления URL без создания дополнительного шага в
истории.
import { useNavigationType } from 'react-router-dom';
function NavigationLogger() {
const navigationType = useNavigationType();
console.log("Тип навигации:", navigationType);
return null;
}
В этом примере navigationType всегда содержит актуальное
значение последнего перемещения по маршрутам. Можно использовать это
значение для различных целей: аналитики, анимации переходов или
условного рендера компонентов.
import { useEffect } from 'react';
import { useNavigationType } from 'react-router-dom';
function AnalyticsTracker() {
const navigationType = useNavigationType();
useEffect(() => {
// Отправка события в систему аналитики
console.log("Пользователь совершил навигацию через:", navigationType);
}, [navigationType]);
return null;
}
import { useNavigationType } from 'react-router-dom';
function BackAwareComponent() {
const navigationType = useNavigationType();
if (navigationType === 'POP') {
// Например, сброс формы при возврате
console.log("Пользователь вернулся на предыдущую страницу");
}
return null;
}
Тип навигации можно использовать для выбора направления анимации: при
PUSH — анимация входа новой страницы, при POP
— анимация возврата к предыдущей.
import { useNavigationType } from 'react-router-dom';
function PageTransition() {
const navigationType = useNavigationType();
const animationClass = navigationType === 'POP' ? 'slide-back' : 'slide-forward';
return <div className={animationClass}>Содержимое страницы</div>;
}
useLocation и сравнение key маршрута.useEffect
позволяет реагировать на каждое изменение типа навигации и выполнять
необходимые операции только при определённых условиях.import { useEffect } from 'react';
import { useNavigationType, useLocation } from 'react-router-dom';
function NavigationHandler() {
const navigationType = useNavigationType();
const location = useLocation();
useEffect(() => {
switch (navigationType) {
case 'PUSH':
console.log("Новая страница добавлена в историю:", location.pathname);
break;
case 'REPLACE':
console.log("Текущая страница заменена на:", location.pathname);
break;
case 'POP':
console.log("Пользователь вернулся/вперёд:", location.pathname);
break;
}
}, [navigationType, location]);
return null;
}
Этот подход обеспечивает полное понимание, как именно пользователь перемещается по приложению, и позволяет строить гибкую логику обработки навигации без избыточного кода.