В библиотеке Navigo система хуков позволяет управлять жизненным циклом маршрутов и добавлять промежуточную логику до и после обработки конкретного пути. Цепочки хуков — это последовательность функций, выполняющихся в строгом порядке, каждая из которых может изменить состояние маршрута, приостановить переход или передать управление следующему хуку. Такой подход обеспечивает гибкое управление навигацией без необходимости вручную писать условные проверки на каждом маршруте.
В Navigo хуки добавляются через объект конфигурации при создании
маршрутизатора или через методы
on/before/after конкретного
маршрута. Основные типы хуков:
done(false) или
перенаправить пользователя.Пример базовой регистрации:
const router = new Navigo('/', { hash: true });
router.before((done, params, route) => {
console.log('Перед переходом:', route.url);
done(); // продолжение цепочки
});
router.on('/home', () => {
console.log('Маршрут /home обработан');
});
router.after((params, route) => {
console.log('После перехода:', route.url);
});
router.resolve();
Цепочка хуков строится по принципу FIFO (первым вошёл — первым выполнен). Для одного маршрута порядок работы выглядит так:
on)Важно понимать, что каждый before хук должен
вызывать функцию done(), иначе переход
остановится. Функция done может принимать аргументы:
done() — продолжить переход.done(false) — отменить переход.done('/new-route') — перенаправить на другой
маршрут.Пример условного перехода с отменой:
router.before((done, params, route) => {
if (!user.isAuthenticated) {
done('/login'); // перенаправление на страницу логина
} else {
done();
}
});
Для маршрутов с дочерними путями можно определять локальные хуки, которые выполняются после глобальных:
router.on('/dashboard', () => {
console.log('Dashboard открыт');
})
.before((done, params, route) => {
console.log('Проверка прав на Dashboard');
done();
})
.after((params, route) => {
console.log('Локальная аналитика Dashboard');
});
В этом примере сначала срабатывает глобальный before,
затем локальный before, потом обработчик маршрута, далее
локальный after, и в конце глобальный
after.
Цепочки хуков полностью поддерживают асинхронное выполнение. Любой
хук может использовать промисы или асинхронные функции, при этом переход
будет ожидать вызова done():
router.before(async (done, params, route) => {
const hasAccess = await checkUserPermissions(params.id);
if (hasAccess) {
done();
} else {
done('/forbidden');
}
});
Асинхронность особенно полезна для авторизации, загрузки данных перед рендером страницы или проверки состояния приложения.
Каждый хук получает одинаковые аргументы:
done — функция управления переходом.params — параметры маршрута, включая динамические
сегменты и query-параметры.route — объект маршрута с информацией о пути, хосте и
состоянии.Эти параметры позволяют передавать информацию через все хуки без глобальных переменных. Например, можно вычислить токен авторизации и использовать его в любом последующем хуке или обработчике маршрута.
router.before((done, params, route) => {
params.token = getAuthToken();
done();
});
router.on('/profile/:id', (params) => {
fetchProfile(params.id, params.token)
.then(profile => renderProfile(profile));
});
Для сложных сценариев можно формировать условные цепочки хуков, где выполнение некоторых функций зависит от состояния:
router.before((done, params) => {
if (params.id === 'admin') {
done('/access-denied'); // редирект
} else {
done();
}
});
router.before((done) => {
console.log('Общий before для всех маршрутов');
done();
});
Такой подход обеспечивает модульность и переиспользуемость логики проверки состояния.
Использование цепочек хуков упрощает внедрение аналитики:
router.after((params, route) => {
analytics.trackPage(route.url, params);
});
Можно подключить несколько after хуков для разных целей — один для логирования, другой для обновления UI, третий для синхронизации состояния приложения.
done() в каждом before
хукe.Цепочки хуков в Navigo превращают маршрутизацию из простого переключателя страниц в мощный инструмент управления навигацией, состояния приложения и безопасности. Грамотное построение цепочек позволяет создавать сложные приложения с чистой, модульной архитектурой.