Navigo — это лёгкая и мощная библиотека для маршрутизации на стороне клиента в JavaScript. Одним из ключевых аспектов работы с Navigo является управление состоянием навигации, которое позволяет отслеживать текущий маршрут, передавать параметры, а также программно изменять состояние приложения без перезагрузки страницы.
Состояние навигации в Navigo формируется вокруг маршрутов, параметров URL и методов навигации. Важно понимать, что Navigo использует историю браузера (History API) для изменения состояния страницы без её полной перезагрузки.
Текущий маршрут Navigo хранит информацию о
текущем маршруте в объекте, который создаётся при каждом срабатывании
router.resolve(). Этот объект содержит:
url — текущий путь;params — параметры, извлечённые из URL;query — объект с query-параметрами (если используется
withQueryParams()).Параметры маршрута При определении маршрутов можно задавать динамические сегменты через двоеточие:
router.on('/user/:id', (params) => {
console.log(params.id); // id пользователя из URL
});
Эти параметры автоматически добавляются в состояние навигации и доступны в обработчиках маршрутов.
Query-параметры Navigo позволяет легко получать
query-параметры через метод withQueryParams():
router.on('/search', (params, query) => {
console.log(query.q); // значение параметра ?q=...
}).withQueryParams();
При этом объект query включается в состояние навигации,
что облегчает управление состоянием приложения.
navigate(path, options)Метод navigate() позволяет программно изменить текущий
маршрут, создавая новое состояние в истории браузера.
router.navigate('/dashboard', { updateBrowserURL: true });
Параметры опций:
updateBrowserURL (boolean) — обновлять URL в адресной
строке или нет;callHandler (boolean) — вызывать ли обработчик маршрута
при навигации.resolve()Метод resolve() используется для обработки текущего URL
и сопоставления его с зарегистрированными маршрутами. Это ключевой метод
для синхронизации состояния навигации при загрузке страницы:
router.resolve();
Если страница загружена с URL /user/42,
resolve() вызовет соответствующий обработчик маршрута и
передаст параметры.
Navigo не предоставляет встроенной системы глобального состояния, но состояние навигации можно сохранять в объекте приложения или использовать сторонние хранилища (например, Redux или простые JS-объекты). Пример:
let appState = {};
router.on('/profile/:id', (params) => {
appState.currentUserId = params.id;
renderProfile(appState.currentUserId);
});
С помощью такого подхода сохраняется актуальная информация о навигации, доступная для других частей приложения.
Navigo поддерживает события, которые помогают отслеживать изменения состояния:
on — основной метод регистрации
обработчика маршрута.hooks — возможность добавления
before и after хуков:router.hooks({
before: (done, params) => {
console.log('Перед переходом', params);
done();
},
after: (params) => {
console.log('После перехода', params);
}
});
Хуки позволяют управлять состоянием приложения до и после изменения маршрута, что особенно важно для асинхронных операций, например, подгрузки данных.
Navigo использует History API, что обеспечивает полное управление состоянием навигации:
pushState — добавляет новый маршрут в историю;replaceState — заменяет текущее состояние;popstate — событие, срабатывающее при возврате к
предыдущему маршруту.Пример навигации с заменой состояния:
router.navigate('/settings', { updateBrowserURL: true, callHandler: true });
Для отслеживания возвращения назад можно использовать обработку
popstate совместно с resolve():
window.addEventListener('popstate', () => {
router.resolve();
});
Иногда требуется проверять текущее состояние маршрута перед
переходом. Для этого можно использовать метод match():
if (!router.match('/admin')) {
router.navigate('/login');
}
match() возвращает объект с информацией о маршруте, если
URL соответствует зарегистрированному маршруту, или null,
если нет совпадений.
Navigo поддерживает обновление маршрутов и состояния на лету. Можно добавлять новые маршруты после инициализации и обновлять обработчики:
router.on('/dashboard/:tab', (params) => {
console.log('Текущая вкладка:', params.tab);
});
router.resolve();
Это позволяет поддерживать сложное состояние приложения с множеством динамических маршрутов.
resolve().navigate() и
resolve() управляют состоянием без перезагрузки.before и after
позволяют контролировать состояние до и после изменения маршрута.popstate.С помощью этих инструментов Navigo обеспечивает точное и гибкое управление состоянием навигации, позволяя создавать масштабируемые одностраничные приложения с чистым и управляемым маршрутизатором.