Vue Router предоставляет мощную систему хуков, которые позволяют управлять навигацией между маршрутами на различных этапах жизненного цикла маршрутов. Для эффективного использования Vue Router важно понимать порядок их выполнения и различия между глобальными, маршрутными и компонентными хуками.
1. Глобальные хуки навигации
beforeEach(to, from, next) – вызывается перед каждой
навигацией. Позволяет выполнять проверку доступа, асинхронные действия
или редиректы.beforeResolve(to, from, next) – срабатывает после того,
как все асинхронные компоненты маршрута были загружены, но до завершения
навигации. Используется для окончательной подготовки данных.afterEach(to, from) – выполняется после завершения
навигации. Не имеет параметра next и не может отменить
переход, используется для аналитики или логирования.2. Хуки маршрута (Route Guards) Определяются в объекте маршрута:
beforeEnter(to, from, next) – выполняется перед тем,
как маршрут будет активирован. Не привязан к компоненту и может
использоваться для централизованной проверки доступа.3. Хуки компонента маршрута
beforeRouteEnter(to, from, next) – выполняется перед
тем, как компонент будет создан. Не имеет доступа к this,
так как экземпляр компонента ещё не создан. Для взаимодействия с
экземпляром можно использовать коллбек
next(vm => {...}).beforeRouteUpdate(to, from, next) – срабатывает при
навигации на тот же компонент, когда изменились параметры маршрута.
Позволяет обновлять данные компонента без его пересоздания.beforeRouteLeave(to, from, next) – выполняется перед
уходом с маршрута. Доступ к this есть, что позволяет
предупреждать пользователя о несохранённых данных или завершать
асинхронные операции.Понимание порядка выполнения хуков критично для предсказуемого поведения маршрутов.
Глобальные хуки beforeEach
Выполняются первыми при любой навигации. Можно использовать для
глобальной авторизации или логирования.
Хуки маршрута beforeEnter
Выполняются после глобальных beforeEach для конкретного
маршрута. Они игнорируют компонент, если маршрут перенаправляет на
другой маршрут.
Хуки компонента beforeRouteEnter
Выполняются после beforeEnter маршрута. На этом этапе
компонент ещё не создан, поэтому доступ к this
отсутствует.
Асинхронная загрузка компонентов Если
используется динамический импорт компонентов (import()),
асинхронные компоненты загружаются после выполнения
beforeRouteEnter.
Глобальные хуки beforeResolve
Срабатывают после того, как все асинхронные компоненты были загружены,
но перед завершением навигации. Это финальная точка для подготовки
данных.
Навигация завершается, компонент создаётся и
рендерится В этот момент создаются экземпляры компонентов
маршрута, выполняются их методы жизненного цикла Vue
(created, mounted и т.д.).
Глобальные хуки afterEach
Выполняются после завершения навигации и рендера компонента.
Используются для аналитики и побочных эффектов, не влияя на саму
навигацию.
next, может остановить переход, вызвав
next(false).next({ name: 'targetRoute' }) или
next('/path').beforeRouteUpdate позволяет обновлять
данные без пересоздания компонента.Для наглядности порядок вызовов можно представить следующим образом:
Global beforeEach
↓
Route beforeEnter
↓
Component beforeRouteEnter
↓
Async component resolution
↓
Global beforeResolve
↓
Component created / mounted
↓
Global afterEach
Если навигация происходит на уже смонтированный компонент:
Global beforeEach
↓
Component beforeRouteUpdate
↓
Global beforeResolve
↓
Component updated
↓
Global afterEach
beforeEach для глобальных проверок и
аутентификации.beforeEnter для маршрутов с уникальной
логикой, например, лендинг страниц или административной части.beforeRouteUpdate для динамических
маршрутов, где параметры могут меняться без перезагрузки
компонента.beforeRouteLeave идеально подходит для предупреждения о
несохранённых данных.afterEach – безопасное место для аналитики и
логирования, не влияющее на навигацию.Понимание строгой последовательности хуков в Vue Router обеспечивает предсказуемость и стабильность приложения, позволяя правильно управлять навигацией и состоянием компонентов.