В библиотеке Navigo прерывание навигации является важным механизмом для контроля маршрутизации, особенно в сложных одностраничных приложениях. Этот функционал позволяет остановить переход на новый маршрут до выполнения определённых условий, например, проверки состояния формы, авторизации пользователя или выполнения асинхронных операций.
beforeNavigo предоставляет метод
before, который вызывается перед
активацией маршрута. Этот метод принимает функцию-предикат, возвращающую
true или false (или промис, который резолвится
в true/false).
Пример базового использования:
const router = new Navigo('/');
router.before((done, match) => {
if (match.url === '/protected' && !userIsLoggedIn()) {
console.log('Доступ запрещён, переход прерван');
done(false); // прерывает навигацию
} else {
done(); // продолжает навигацию
}
});
router.on('/protected', () => {
console.log('Вы перешли на защищённый маршрут');
});
Ключевые моменты:
done(false) — прерывает текущий переход.done() или done(true) — позволяет
навигации продолжиться.match содержит информацию о маршруте, включая параметры
и URL.Функция before может работать с асинхронными операциями.
Для этого достаточно вызвать done() внутри промиса или
асинхронной функции:
router.before(async (done, match) => {
if (match.url.startsWith('/admin')) {
const authorized = await checkUserRole();
if (!authorized) {
alert('У вас нет прав для доступа к этому разделу');
done(false);
return;
}
}
done();
});
Преимущества такого подхода:
Помимо before, иногда требуется прервать навигацию уже
внутри обработчика маршрута. В таких случаях можно использовать условные
конструкции и возвращать управление без изменения состояния:
router.on('/edit/:id', (params) => {
if (!hasUnsavedChanges()) {
return; // навигация "не выполняется"
}
loadEditor(params.id);
});
Здесь фактическое прерывание происходит на уровне логики обработчика,
хотя URL может измениться. Для полного контроля лучше использовать
before.
Navigo позволяет добавлять глобальный before для всех
маршрутов:
router.before((done, match) => {
if (needsMaintenance()) {
console.log('Сайт на обслуживании, переходы заблокированы');
done(false);
} else {
done();
}
});
Это удобно для:
before и onLeaveДля полного контроля жизненного цикла маршрутов можно комбинировать
before с onLeave. Метод onLeave
вызывается при уходе с текущего маршрута и позволяет предотвратить
потерю данных:
router.onLeave('/edit/:id', (done, params) => {
if (hasUnsavedChanges()) {
const confirmExit = confirm('Есть несохранённые изменения. Выйти?');
done(confirmExit);
} else {
done();
}
});
Особенности:
done(false) предотвращает уход с текущего
маршрута.before, создавая гибкую
систему управления навигацией.В сложных приложениях часто требуется несколько условий для
навигации. Порядок вызова before имеет значение:
before.before на уровне маршрута.onLeave предыдущего маршрута.Для гарантированной блокировки навигации достаточно, чтобы хотя бы
одна проверка вызвала done(false).
| Метод | Сценарий использования | Результат |
|---|---|---|
router.before(fn) |
Проверка перед переходом на маршрут | done(false) блокирует |
router.onLeave(route, fn) |
Проверка при уходе с маршрута | done(false) отменяет уход |
| Хэндлер маршрута | Локальные проверки внутри маршрута | Можно вернуть без выполнения действия |
Эта комбинация методов позволяет строить безопасные, интерактивные приложения с контролем всех аспектов маршрутизации.
Прерывание навигации в Navigo обеспечивает надежный механизм защиты от нежелательных переходов и потерянных данных, а также гибко интегрируется с асинхронными сценариями и глобальными проверками состояния приложения.