React Router предоставляет гибкие возможности для управления навигацией в приложении на React. Одним из ключевых аспектов сложных приложений является логирование навигации — отслеживание переходов между маршрутами, которое может использоваться для аналитики, отладки или сохранения истории действий пользователя.
useLocationОсновным инструментом для отслеживания текущего маршрута является хук
useLocation. Он возвращает объект, содержащий информацию о
текущем пути и состоянии навигации:
import { useLocation } from 'react-router-dom';
import { useEffect } from 'react';
function Logger() {
const location = useLocation();
useEffect(() => {
console.log('Переход на маршрут:', location.pathname);
}, [location]);
return null;
}
Ключевые моменты:
location.pathname содержит текущий путь.useEffect с зависимостью [location]
позволяет реагировать на каждое изменение маршрута.location можно хранить дополнительные данные
через state при навигации.useNavigateДля программного перехода между маршрутами используется хук
useNavigate. Логирование таких переходов возможно напрямую
в момент вызова функции навигации:
import { useNavigate } from 'react-router-dom';
function NavigationButton() {
const navigate = useNavigate();
const handleClick = () => {
console.log('Навигация к /dashboard');
navigate('/dashboard', { state: { from: 'home' } });
};
return <button onCl ick={handleClick}>Перейти на Dashboard</button>;
}
Особенности:
state.React Router предоставляет объект history, через который
можно подписаться на изменения маршрутов. В последних версиях (v6+)
доступ к объекту истории осуществляется через хук
useNavigationType и useLocation. Для более
детального контроля можно реализовать кастомный хук:
import { useEffect } from 'react';
import { useLocation, useNavigationType } from 'react-router-dom';
function useNavigationLogger() {
const location = useLocation();
const navigationType = useNavigationType();
useEffect(() => {
console.log(`Навигация: ${navigationType} -> ${location.pathname}`);
}, [location, navigationType]);
}
Пояснения:
navigationType может быть "PUSH",
"POP", "REPLACE", что помогает различать тип
перехода.location и navigationType
позволяет создавать детализированные логи для аналитики и отладки.Для аналитических целей переходы можно отправлять на сервер или в сторонние сервисы аналитики:
import { useEffect } from 'react';
import { useLocation } from 'react-router-dom';
function AnalyticsLogger() {
const location = useLocation();
useEffect(() => {
fetch('/api/log-navigation', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ path: location.pathname, timestamp: Date.now() }),
});
}, [location]);
}
Плюсы такого подхода:
state маршрута для получения
дополнительной информации о контексте перехода.Логирование удобно инкапсулировать в отдельные компоненты или кастомные хуки, чтобы оно применялось глобально:
function NavigationMonitor({ children }) {
useNavigationLogger();
return children;
}
// Использование в App.js
<BrowserRouter>
<NavigationMonitor>
<AppRoutes />
</NavigationMonitor>
</BrowserRouter>
Такой подход обеспечивает:
useEffect при
каждом переходе.PUSH, POP, REPLACE).Логирование навигации в React Router обеспечивает прозрачность поведения приложения, упрощает отладку и позволяет строить детализированную аналитику действий пользователей.