В библиотеке Navigo хуки представляют собой специальные функции, которые позволяют перехватывать процесс навигации и выполнять дополнительные действия до или после изменения маршрута. Хуки делятся на несколько типов: before, after, already, error, и каждый из них имеет своё предназначение и область применения. Использование хуков повышает контроль над жизненным циклом маршрутов и позволяет реализовать сложную логику, например, проверку авторизации или динамическую подгрузку данных.
beforeХук before вызывается перед активацией
маршрута. Он принимает два параметра: объект
done и объект params.
Сигнатура:
router.hooks({
before: (done, params) => {
// логика до смены маршрута
done();
}
});
Особенности:
done() не вызывается, переход по маршруту не
произойдет.Пример использования:
router.hooks({
before: (done, params) => {
if (!user.isAuthenticated()) {
router.navigate('/login');
} else {
done();
}
}
});
В этом примере переход на защищённый маршрут блокируется для неавторизованного пользователя.
afterХук after вызывается после того, как маршрут
активирован и отрендерен. Он полезен для выполнения побочных
эффектов, которые не влияют на саму навигацию.
Сигнатура:
router.hooks({
after: (params) => {
console.log('Маршрут активирован', params);
}
});
Особенности:
alreadyХук already срабатывает, если пользователь пытается
перейти на текущий маршрут. По умолчанию Navigo
игнорирует такие переходы, но с хуком можно обработать повторный
вызов.
Пример:
router.hooks({
already: (params) => {
console.log('Пользователь снова на этом маршруте', params);
}
});
Используется для:
errorХук error позволяет обрабатывать ошибки
навигации, например, если маршрут не найден или возникла
проблема в callback-функции маршрута.
Сигнатура:
router.hooks({
error: (error) => {
console.error('Ошибка маршрутизации', error);
router.navigate('/404');
}
});
Особенности:
При навигации в Navigo порядок вызова хуков следующий:
before – проверка условий и возможность остановить
навигацию.before завершён через done(), маршрут
активируется.already – если переход был на текущий маршрут.after – выполнение побочных действий после активации
маршрута.error – вызывается при любой ошибке в процессе.Хуки интегрируются с параметрами маршрута, что делает их мощным инструментом для работы с динамическими URL.
Пример с динамическим параметром:
router
.on('/profile/:userId', ({ userId }) => {
console.log('Загрузка профиля пользователя', userId);
})
.hooks({
before: (done, params) => {
if (!isValidUser(params.userId)) {
router.navigate('/not-found');
} else {
done();
}
},
after: (params) => {
console.log('Профиль загружен', params.userId);
}
});
В этом примере:
before проверяет существование пользователя перед
загрузкой страницы.after выполняет действия после успешной загрузки.Можно одновременно использовать несколько типов хуков, создавая комплексную логику маршрутизации.
Пример:
router.hooks({
before: (done, params) => {
console.log('Перед маршрутом', params);
done();
},
after: (params) => {
console.log('После маршрута', params);
},
already: (params) => {
console.log('Уже на маршруте', params);
},
error: (err) => {
console.error('Ошибка маршрута', err);
}
});
Это позволяет централизованно управлять навигацией и реакциями на события.
Тестирование хуков требует изоляции логики от реальной навигации. Основные подходы:
Мокирование объекта Router:
navigate и on для
проверки вызова хуков.Проверка последовательности вызовов:
Асинхронные хуки:
done() после завершения, иначе тесты будут
застывать.Пример теста с Jest:
test('before hook останавливает переход при ошибке', () => {
const done = jest.fn();
const params = {};
const beforeHook = (done, params) => {
done();
};
beforeHook(done, params);
expect(done).toHaveBeenCalled();
});
before для проверок и
редиректов, after для побочных
эффектов.Хуки в Navigo позволяют выстраивать гибкую архитектуру SPA и централизованно управлять всеми этапами навигации. Их грамотное использование обеспечивает контроль, безопасность и удобство поддержки маршрутов.