# Сбои при навигации
Добавлено в версии 3.4.0
При использовании router-link Vue Router вызывает router.push для запуска навигации. В большинстве случаев ожидаемое поведение ссылок заключается в переходе на новую страницу, но есть несколько ситуаций при которых пользователь остаётся на той же странице:
- Пользователь уже находится на странице, на которую пытается перейти
- Навигационный хук прерывает навигацию вызовом
next(false) - Навигационный хук выбрасывает ошибку или вызывает
next(new Error())
При использовании компонента router-link ни один из этих случаев не будет логироваться как ошибка. Однако при использовании router.push или router.replace можно столкнуться с сообщением "Uncaught (in promise) Error" после которого в консоли последует более конкретное сообщение. Давайте разберемся как отличать сбои навигации.
История вопроса
В версии 3.2.0, навигационные сбои доступны через два необязательных коллбэка router.push: onComplete и onAbort. Начиная с версии 3.1.0, router.push и router.replace возвращают Promise если не указаны коллбэки onComplete/onAbort. Этот Promise разрешается вместо вызова onComplete и отклоняется вместо вызова onAbort.
# Обнаружение сбоев навигации
Сбой навигации будет экземпляром Error с парой дополнительных свойств. Проверить произошла ли ошибка в маршрутизаторе можно с помощью функции isNavigationFailure:
import VueRouter from 'vue-router'
const { isNavigationFailure, NavigationFailureType } = VueRouter
// попытка перехода к странице администрирования
router
.push('/admin')
.catch(failure => {
if (isNavigationFailure(failure, NavigationFailureType.redirected)) {
// отображение уведомления пользователю
showToast('Необходимо авторизоваться для доступа к панели администрирования')
}
})
СОВЕТ
Если опустить второй параметр в isNavigationFailure(failure), то будет проверяться только, является ли ошибка сбоем навигации.
# Тип NavigationFailureType
Тип NavigationFailureType поможет разработчикам определять тип навигационного сбоя. Существует 4 различных типа:
redirected: внутри навигационного хука был вызванnext(newLocation)для перенаправления в другое место.aborted: внутри навигационного хука был вызванnext(false)для отмены навигации.cancelled: произошла полностью новая навигация до того, как текущая могла закончиться. Например, во время ожидания внутри навигационного хука был вызванrouter.push.duplicated: навигация была предотвращена, потому что уже находимся в месте назначения.
# Свойства ошибок навигации
Все сбои навигации предоставляют доступ к свойствам to и from, отображающие для навигации в которой произошёл сбой местоположение места назначения и текущее местоположение соответственно:
// попытка получения доступа к странице администрирования
router
.push('/admin')
.catch(failure => {
if (isNavigationFailure(failure, NavigationFailureType.redirected)) {
console.log(failure.to.path) // '/admin'
console.log(failure.from.path) // '/'
}
})
Во всех случаях значения to и from будут объектами нормализованных маршрутов.