В современных веб-приложениях часто возникает необходимость обрабатывать запросы к несуществующим маршрутам. Vue Router предоставляет гибкие средства для реализации маршрутов-заглушек, которые отображают страницу ошибки 404, когда пользователь пытается открыть путь, не определённый в конфигурации маршрутизатора.
Маршрут-заглушка для 404 создаётся с использованием
псевдомаршрута, который захватывает все пути, не
соответствующие существующим маршрутам. В Vue Router 4 это реализуется с
помощью символа :pathMatch(.*)*.
Пример определения маршрута-заглушки:
import { createRouter, createWebHistory } from 'vue-router';
import HomePage from '@/views/HomePage.vue';
import AboutPage from '@/views/AboutPage.vue';
import NotFoundPage from '@/views/NotFoundPage.vue';
const routes = [
{
path: '/',
name: 'Home',
component: HomePage
},
{
path: '/about',
name: 'About',
component: AboutPage
},
{
path: '/:pathMatch(.*)*',
name: 'NotFound',
component: NotFoundPage
}
];
const router = createRouter({
history: createWebHistory(),
routes
});
export default router;
Ключевые моменты:
:pathMatch(.*)* — регулярное выражение, которое
соответствует любому пути.routes, чтобы сначала проверялись все конкретные
маршруты.NotFoundPage отображает интерфейс ошибки
404.Для улучшения пользовательского опыта можно передавать в компонент 404 информацию о том, какой путь был введён пользователем:
{
path: '/:pathMatch(.*)*',
name: 'NotFound',
component: NotFoundPage,
props: route => ({ invalidPath: route.path })
}
В компоненте NotFoundPage.vue можно использовать
props:
<template>
<div>
<h1>Страница не найдена (404)</h1>
<p>Маршрут "{{ invalidPath }}" не существует.</p>
</div>
</template>
<script>
export default {
props: ['invalidPath']
}
</script>
Такой подход позволяет предоставлять пользователю контекстную информацию и ссылку на главную страницу, повышая удобство навигации.
Иногда необходимо направлять пользователя на страницу 404 через код,
например, при получении некорректного идентификатора ресурса. Vue Router
позволяет это сделать через метод router.push:
import { useRouter } from 'vue-router';
export default {
setup() {
const router = useRouter();
function redirectToNotFound() {
router.push({ name: 'NotFound' });
}
return { redirectToNotFound };
}
}
Использование именованного маршрута name: 'NotFound'
делает навигацию более безопасной и независимой от конкретного URL.
Для вложенных маршрутов также можно настроить глобальную обработку
404. Например, если есть раздел dashboard с дочерними
страницами, и нужно отлавливать неверные пути внутри этого раздела:
{
path: '/dashboard',
component: DashboardLayout,
children: [
{ path: '', component: DashboardHome },
{ path: 'settings', component: DashboardSettings },
{ path: ':pathMatch(.*)*', component: NotFoundPage }
]
}
В этом случае неправильный путь в пределах /dashboard
будет обрабатываться отдельно от глобального маршрута 404.
Страница 404 должна быть визуально заметной, чтобы пользователь понял, что произошла ошибка. Часто используют:
404С точки зрения Vue Router, это полностью обычный компонент, который можно расширять любыми средствами Vue, включая динамические данные, анимацию и условное отображение контента.
:pathMatch(.*)*
гарантируют, что все неопределённые маршруты попадут на страницу 404 без
необходимости перечислять их вручную.Маршрут-заглушка для 404 является важной частью архитектуры SPA на Vue, обеспечивая корректную обработку ошибок навигации и поддерживая высокое качество пользовательского интерфейса.