Vue Router предоставляет гибкие возможности для управления навигацией
между маршрутами. Одним из ключевых инструментов для этого является
функция next, используемая в навигационных охранниках
(navigation guards). Она позволяет решать, разрешить ли переход,
перенаправить пользователя или отменить переход полностью.
next в глобальных охранникахГлобальные охранники регистрируются на экземпляре маршрутизатора и
применяются ко всем переходам. Основной метод —
beforeEach:
router.beforeEach((to, from, next) => {
// Логика проверки авторизации
if (to.meta.requiresAuth && !isAuthenticated()) {
next('/login'); // перенаправление на страницу входа
} else {
next(); // разрешение перехода
}
});
Ключевые моменты:
next() — разрешает переход на запрошенный маршрут.next(false) — отменяет текущий переход, оставляя
пользователя на текущем маршруте.next('/') или next({ path: '/' }) —
выполняет перенаправление на указанный путь.next должен быть вызван ровно один раз,
иначе навигация зависнет.Каждый маршрут может иметь собственный охранник
beforeEnter:
const routes = [
{
path: '/admin',
component: AdminPanel,
beforeEnter: (to, from, next) => {
if (hasAdminAccess()) {
next();
} else {
next('/403'); // страница запрещено
}
}
}
];
Особенности beforeEnter:
beforeEach в том, что глобальные охранники
срабатывают при каждом переходе, а beforeEnter — только при
входе на конкретный маршрут.Компоненты Vue могут объявлять собственные охранники через
beforeRouteEnter, beforeRouteUpdate и
beforeRouteLeave.
export default {
beforeRouteEnter(to, from, next) {
// Доступ к this невозможен здесь
next(vm => {
vm.fetchData(to.params.id);
});
},
beforeRouteUpdate(to, from, next) {
// Переход к тому же компоненту с новыми параметрами
this.fetchData(to.params.id);
next();
},
beforeRouteLeave(to, from, next) {
if (this.hasUnsavedChanges) {
const answer = window.confirm('У вас есть несохраненные изменения. Выйти?');
next(answer);
} else {
next();
}
}
}
Примечания:
beforeRouteEnter не имеет доступа к экземпляру
компонента через this до вызова next.next может принимать функцию, которая получает
экземпляр компонента после завершения навигации.beforeRouteUpdate вызывается при изменении параметров
маршрута без уничтожения компонента.beforeRouteLeave подходит для предупреждения о
несохраненных изменениях.nextnext может принимать несколько типов аргументов:
next() — переход
разрешён.next(false) —
переход отменён.next('/home');
next({ name: 'profile', params: { userId: 123 } });
beforeRouteEnter для доступа к компоненту.Навигационные охранники часто выполняют асинхронные действия, например, проверку токена или загрузку данных:
router.beforeEach(async (to, from, next) => {
try {
const authorized = await checkAuthorization();
if (authorized) {
next();
} else {
next('/login');
}
} catch (error) {
console.error(error);
next('/error');
}
});
Особенности:
next после завершения всех проверок или
обработки ошибок.nextПри навигации Vue Router вызывает охранники в строгом порядке:
beforeEachbeforeEnterbeforeRouteEnterЕсли один из охранников вызывает next(false), дальнейшие
охранники не вызываются. Перехват и управление навигацией через
next позволяют полностью контролировать поток
маршрутов.
Контроль навигации через next является фундаментальным
инструментом для создания безопасных, отзывчивых и логически управляемых
маршрутов в приложениях на Vue.js. Правильное использование позволяет
полностью контролировать поток переходов и обрабатывать все возможные
сценарии поведения пользователя.