В библиотеке Navigo для маршрутизации в JavaScript
хук after используется для выполнения действий после того,
как маршрут был успешно обработан. Он позволяет централизованно
управлять поведением приложения после смены маршрута, обеспечивая гибкую
организацию кода и уменьшение дублирования логики в обработчиках
отдельных маршрутов.
afterХук after вызывается после того, как был выполнен
обработчик маршрута (callback функции, переданные в методах
on или resolve). Он получает информацию о
текущем маршруте и позволяет:
Это особенно полезно в одностраничных приложениях, где важно централизованно контролировать действия после каждой смены маршрута.
afterafter задается с помощью метода hooks
объекта Navigo:
import Navigo from 'navigo';
const router = new Navigo('/', { hash: true });
router.hooks({
after: (params, route) => {
console.log('Маршрут обработан:', route.name);
console.log('Параметры маршрута:', params);
}
});
params – объект с параметрами текущего
маршрута.route – объект с информацией о
маршруте, включая name, url и другие
свойства.Хук срабатывает каждый раз после выполнения обработчика маршрута,
независимо от того, был ли маршрут установлен явно через
navigate или пользователь использовал браузерные элементы
управления.
Параметры, передаваемые в after, позволяют динамически
реагировать на смену маршрута:
router.on('/user/:id', (params) => {
console.log('Переход к пользователю:', params.id);
}).hooks({
after: (params, route) => {
if (route.url.startsWith('/user')) {
document.title = `Профиль пользователя ${params.id}`;
}
}
});
В этом примере заголовок страницы автоматически обновляется после каждого перехода к маршруту пользователя.
after можно
задать один раз для всего роутера. Он будет выполняться после всех
маршрутов.Promise, хук after срабатывает
только после завершения промиса, что позволяет безопасно работать с
асинхронными данными.router.on('/posts', async () => {
const posts = await fetchPosts();
renderPosts(posts);
}).hooks({
after: (params, route) => {
console.log('Данные успешно загружены для маршрута', route.url);
}
});
this: внутри
after контекст this не связан с компонентами,
а относится к внутреннему объекту роутера.beforeВ отличие от хука before, который выполняется перед
обработкой маршрута и может блокировать или перенаправлять навигацию,
after не влияет на выполнение маршрута и предназначен
исключительно для действий после завершения маршрута.
router.hooks({
before: (done, params, route) => {
if (!isAuthenticated()) {
return router.navigate('/login');
}
done();
},
after: (params, route) => {
console.log('Пользователь авторизован, маршрут завершён:', route.url);
}
});
router.hooks({
after: (params, route) => {
sendAnalytics(route.url, route.name);
}
});
router.hooks({
after: (params, route) => {
document.querySelectorAll('.active').forEach(el => el.classList.remove('active'));
document.querySelector(`[data-route="${route.name}"]`)?.classList.add('active');
}
});
router.hooks({
after: () => {
resetTemporaryFormData();
stopLoadingIndicators();
}
});
Если требуется несколько действий после маршрута, их можно объединять
в одном хуке after или использовать вспомогательные функции
для структурирования кода:
const updateUI = (params, route) => { /* ... */ };
const trackRoute = (params, route) => { /* ... */ };
router.hooks({
after: (params, route) => {
updateUI(params, route);
trackRoute(params, route);
}
});
Хук after в Navigo обеспечивает централизованное
выполнение постобработки маршрутов, позволяет работать с
параметрами и информацией о маршруте, поддерживает асинхронные операции
и служит инструментом для глобальной логики интерфейса и аналитики. Его
правильное использование повышает читаемость кода и упрощает поддержку
сложных одностраничных приложений.