В библиотеке Navigo маршруты можно настраивать не только
для обработки переходов на определённые URL, но и для управления логикой
выхода с маршрута. Для этого используется hook leave. Он
позволяет выполнять определённые действия перед тем, как
пользователь покидает текущий маршрут, например, проверку
состояния формы, сохранение данных или отмену перехода при несохранённых
изменениях.
router.on('/profile', {
leave: (done, params, current) => {
if (!confirm('Вы уверены, что хотите покинуть страницу?')) {
done(false); // Отмена перехода
} else {
done(); // Разрешение перехода
}
}
});
В этом примере функция leave получает три аргумента:
done(false), переход будет остановлен.on при обработке
маршрута.leaveHook leave поддерживает асинхронные операции, что
позволяет, например, отправлять запрос на сервер или показывать
модальное окно для подтверждения выхода. В этом случае вызов
done следует делать после завершения асинхронной
операции.
router.on('/settings', {
leave: async (done, params, current) => {
try {
const result = await showConfirmationDialog('Сохранить изменения перед выходом?');
if (result === 'cancel') {
done(false);
} else {
await saveSettings();
done();
}
} catch (err) {
console.error(err);
done(false);
}
}
});
Использование async/await делает код более читаемым и
позволяет легко интегрировать промисы в логику выхода с маршрута.
leave с другими хукамиleave можно использовать вместе с хуками
before и after, создавая полную цепочку
контроля маршрута:
Пример комплексного использования:
router.on('/dashboard', {
before: (done, params) => {
console.log('Проверка прав доступа...');
done();
},
leave: (done, params, current) => {
if (unsavedChanges()) {
alert('Есть несохранённые изменения!');
done(false);
} else {
done();
}
},
after: (params, current) => {
console.log('Переход на dashboard завершён.');
}
});
В этом случае, если функция leave возвращает
done(false), переход на новый маршрут не произойдёт,
несмотря на успешное выполнение before на новом
маршруте.
leave для нескольких маршрутовДля удобства можно назначать общий leave для нескольких
маршрутов с помощью wildcard или группы:
router.on(['/profile', '/settings', '/account'], {
leave: (done, params, current) => {
if (hasUnsavedChanges()) {
if (!confirm('Есть несохранённые изменения. Продолжить?')) {
done(false);
return;
}
}
done();
}
});
Таким образом, один обработчик управляет выходом сразу с нескольких маршрутов, что упрощает поддержку приложения с большим количеством страниц.
leave должны быть быстрыми, иначе пользователь
почувствует задержку при переходе.done – даже если
переход отменяется, вызов done(false) обязателен, иначе
переход может зависнуть.params и
current – для проверки состояния конкретного
маршрута и передачи информации в логику выхода.leave должны быть безопасными, чтобы
не нарушить навигацию.Использование hook leave в Navigo
обеспечивает гибкий контроль над навигацией, повышая надёжность
приложений и предотвращая нежелательные потери данных.