В Vue Router управление навигацией и обработкой ошибок является важной частью построения надежного пользовательского интерфейса. Особое внимание уделяется страницам ошибок, таким как 404 Not Found или 500 Internal Server Error, которые позволяют пользователю получать корректную информацию при некорректных маршрутах или внутренних сбоях приложения.
Для создания кастомной страницы ошибки необходимо определить маршрут,
который будет перехватывать все неизвестные пути. В Vue Router это
делается с помощью специального паттерна path: '*' или
более современного path: '/:pathMatch(.*)*':
import { createRouter, createWebHistory } from 'vue-router';
import HomePage from './views/HomePage.vue';
import NotFoundPage from './views/NotFoundPage.vue';
const routes = [
{
path: '/',
name: 'Home',
component: HomePage
},
{
path: '/:pathMatch(.*)*',
name: 'NotFound',
component: NotFoundPage
}
];
const router = createRouter({
history: createWebHistory(),
routes
});
export default router;
Ключевые моменты:
/:pathMatch(.*)* позволяет поймать
абсолютно любой путь, который не соответствует ранее определённым
маршрутам.Компонент страницы ошибки обычно содержит информативное сообщение и ссылки для возврата на главные разделы сайта:
<template>
<div class="not-found">
<h1>404 - Страница не найдена</h1>
<p>Запрашиваемая страница отсутствует или была удалена.</p>
<router-link to="/">Вернуться на главную</router-link>
</div>
</template>
<script>
export default {
name: 'NotFoundPage'
}
</script>
<style scoped>
.not-found {
text-align: center;
margin-top: 100px;
}
.not-found h1 {
font-size: 3em;
color: #e74c3c;
}
.not-found p {
font-size: 1.2em;
margin: 20px 0;
}
</style>
Особенности:
router-link для перехода по
внутренним маршрутам, чтобы сохранить SPA-навигацию.Vue Router позволяет обрабатывать ошибки навигации через глобальные
хуки router.beforeEach и router.onError.
Например, можно перенаправлять пользователя на страницу ошибки при
невозможности загрузки компонента:
router.onError((error) => {
console.error('Ошибка маршрута:', error);
router.push({ name: 'NotFound' });
});
Особенности:
router.onError ловит ошибки загрузки компонентов,
ошибки сетевых запросов при динамическом импорте и другие исключения,
связанные с маршрутизацией.Для серверного рендеринга или при использовании Nuxt.js можно добавлять маршруты с кастомными HTTP-кодами ошибок. В стандартном SPA подход заключается в отображении различных компонентов в зависимости от типа ошибки:
const routes = [
{
path: '/error/:code',
name: 'ErrorPage',
component: () => import('./views/ErrorPage.vue'),
props: true
}
];
В компоненте ErrorPage.vue можно принимать
code как prop и динамически менять сообщение:
<template>
<div class="error-page">
<h1>{{ code }} - {{ message }}</h1>
<router-link to="/">На главную</router-link>
</div>
</template>
<script>
export default {
name: 'ErrorPage',
props: ['code'],
computed: {
message() {
switch (this.code) {
case '403': return 'Доступ запрещён';
case '404': return 'Страница не найдена';
case '500': return 'Внутренняя ошибка сервера';
default: return 'Неизвестная ошибка';
}
}
}
}
</script>
Преимущества подхода:
Для оптимизации производительности рекомендуется загружать страницы ошибок динамически:
const NotFoundPage = () => import('./views/NotFoundPage.vue');
Это снижает размер основного бандла и ускоряет первоначальную загрузку приложения.
Можно интегрировать кастомные страницы ошибок с проверкой авторизации или доступности маршрутов:
router.beforeEach((to, from, next) => {
const userHasAccess = checkAccess(to);
if (!userHasAccess) {
next({ name: 'ErrorPage', params: { code: 403 } });
} else {
next();
}
});
Такой подход объединяет логику безопасности и обработку ошибок в единую систему маршрутизации.
router.onError и guards.Кастомные страницы ошибок в Vue Router обеспечивают плавный пользовательский опыт, позволяя корректно информировать о любых сбоях маршрутизации и предотвращать появление пустых или сломанных страниц.