Vue Router предоставляет мощную систему навигационных хуков, позволяющую контролировать переходы между маршрутами на различных уровнях приложения. Навигационные хуки делятся на глобальные, на уровне маршрута и на уровне компонента. Каждый из них имеет своё назначение и порядок вызова, что важно учитывать при построении сложной логики маршрутизации.
Глобальные хуки регистрируются на экземпляре маршрутизатора и отслеживают все переходы в приложении. Основные типы:
beforeEach(to, from, next) Вызывается перед каждой навигацией. Используется для проверки прав доступа, аутентификации и выполнения подготовительных действий.
to – объект маршрута, к которому осуществляется
переход
from – объект маршрута, с которого происходит
переход
next – функция, определяющая дальнейший путь
навигации:
next() – продолжить навигациюnext(false) – отменить переходnext('/path') – перенаправить на другой маршрутbeforeResolve(to, from, next) Вызывается после
beforeEach, но перед окончательной навигацией. Отличается
тем, что уже доступны все асинхронные компоненты маршрута. Используется
для динамической загрузки данных, необходимых перед отображением
компонента.
afterEach(to, from) Вызывается после завершения
навигации. Не имеет аргумента next, так как навигация уже
завершена. Подходит для аналитики, логирования или изменения состояния
приложения после перехода.
Каждый маршрут может содержать собственные хуки, определяемые в объекте маршрута:
const routes = [
{
path: '/dashboard',
component: Dashboard,
beforeEnter: (to, from, next) => {
if (userIsAuthenticated()) {
next();
} else {
next('/login');
}
}
}
];
Компоненты маршрута могут определять следующие хуки:
this невозможен. Для работы с экземпляром
компонента используется функция обратного вызова:beforeRouteEnter(to, from, next) {
next(vm => {
vm.loadData();
});
}
beforeRouteUpdate(to, from, next) Срабатывает,
когда текущий компонент остаётся тем же, но меняются параметры маршрута
(params, query). Позволяет обновлять данные
без полного уничтожения и повторного создания компонента.
beforeRouteLeave(to, from, next) Вызывается перед уходом с маршрута, на котором находится компонент. Применяется для предупреждения пользователя о несохранённых данных или для отмены навигации при необходимости.
Понимание порядка вызова критично для построения корректной логики:
Этот порядок гарантирует, что глобальная логика выполняется до локальной, а финальные действия после успешного завершения навигации.
Все хуки могут возвращать Promise вместо
использования next(), что упрощает работу с асинхронными
операциями:
router.beforeEach(async (to, from) => {
const authorized = await checkUserAccess();
if (!authorized) {
return '/login';
}
});
Возвращение строки маршрута или объекта
{ path: '/login' } заменяет вызов next() для
перенаправления.
beforeEach, чтобы избежать дублирования кода на уровне
маршрутов.beforeResolve оптимально для
предварительной загрузки асинхронных компонентов или данных перед
отображением страницы.В больших приложениях часто возникает потребность адаптировать хуки под:
Promise или async/await для
гарантированного завершения перед навигациейПример обработки вложенного маршрута с асинхронной загрузкой данных:
const routes = [
{
path: '/projects/:id',
component: ProjectLayout,
beforeEnter: async (to) => {
const project = await fetchProject(to.params.id);
if (!project) return '/not-found';
},
children: [
{
path: 'overview',
component: ProjectOverview
},
{
path: 'tasks',
component: ProjectTasks
}
]
}
];
Здесь beforeEnter проверяет существование проекта перед
загрузкой дочерних маршрутов, предотвращая ненужные рендеры
компонентов.