Navigo — легковесная библиотека для маршрутизации в одностраничных приложениях на JavaScript. Один из ключевых аспектов работы с Navigo — передача состояния между маршрутами, позволяющая сохранять данные, передавать параметры и управлять навигацией без перезагрузки страницы.
В Navigo маршруты могут содержать динамические параметры. Параметры
определяются через двоеточие (:) в пути маршрута:
const router = new Navigo('/');
router.on('/user/:id', (params) => {
console.log(params.id);
});
router.on('/product/:category/:id', (params) => {
console.log(params.category, params.id);
});
При переходе по URL /product/electronics/42 объект
params будет выглядеть так:
{ category: 'electronics', id: '42' }.
Navigo поддерживает передачу query-параметров через объект состояния
при вызове метода navigate. Этот способ позволяет
передавать дополнительную информацию, не изменяя путь маршрута.
router.navigate('/dashboard', { state: { userId: 123, theme: 'dark' } });
При этом можно получить состояние в обработчике маршрута через объект
location:
router.on('/dashboard', (match) => {
console.log(match.data.state.userId); // 123
console.log(match.data.state.theme); // 'dark'
});
router.navigate('/user/42', { state: { from: 'homepage' } });
router.on('/user/:id', (match) => {
console.log(match.params.id); // '42'
console.log(match.data.state.from); // 'homepage'
});
Метод navigate позволяет передавать состояние при любом
программном переходе:
router.navigate('/settings', { state: { lastVisited: '/dashboard' } });
on и resolveNavigo предоставляет объект match, который содержит:
match.url — текущий путь.match.params — параметры маршрута.match.data.state — состояние, переданное через
navigate.Пример:
router.on('/profile/:userId', (match) => {
const { userId } = match.params;
const previousPage = match.data.state?.from || 'unknown';
console.log(`Пользователь ${userId}, пришёл с ${previousPage}`);
});
Метод resolve() позволяет обработать состояние при
загрузке страницы или ручном вызове:
router.resolve('/profile/42', { state: { from: 'login' } });
Navigo интегрируется с history API. При передаче
состояния через navigate:
history.state).router.on('/cart', (match) => {
console.log(match.data.state?.selectedItems);
});
router.navigate('/cart', { state: { selectedItems: [101, 102, 103] } });
При возврате на предыдущий маршрут match.data.state
содержит правильные данные.
resolve данные будут потеряны.history.state.:param → match.params.param.{ state: {...} } → match.data.state.history.state для корректной навигации назад/вперёд.Передача состояния в Navigo обеспечивает простую и эффективную работу с данными маршрутов, позволяя строить интерактивные SPA без лишнего дублирования информации в URL.