Как работает Vue Router и как настраиваются маршруты?
Vue Router — это официальная маршрутизирующая библиотека для Vue.js, которая позволяет организовывать навигацию между компонентами в одностраничных приложениях (SPA). Она позволяет определять маршруты (routes), которые соответствуют URL-адресам, и отображать соответствующие компоненты при переходе по этим адресам. Vue Router интегрируется с реактивной системой Vue, поддерживает вложенные маршруты, динамические параметры, lazy loading, переходы и многое другое.
Установка
Для Vue 3:
npm install vue-router@4
Затем импорт и регистрация в main.js или main.ts:
import { createApp } from 'vue';
import App from './App.vue';
import { createRouter, createWebHistory } from 'vue-router';
import Home from './views/Home.vue';
import About from './views/About.vue';
const routes = \[
{ path: '/', component: Home },
{ path: '/about', component: About }
\];
const router = createRouter({
history: createWebHistory(),
routes
});
const app = createApp(App);
app.use(router);
app.mount('#app');
Структура маршрутов
Каждый маршрут — это объект в массиве routes:
const routes = \[
{
path: '/',
name: 'Home',
component: HomePage
},
{
path: '/about',
name: 'About',
component: AboutPage
}
\];
Основные поля маршрута:
-
path: URL-путь, с которым должен сопоставляться маршрут.
-
name: (опционально) имя маршрута — используется для навигации по имени.
-
component: компонент, который будет отображён при переходе.
-
children: вложенные маршруты.
-
props: можно передавать параметры как props в компонент.
Использование маршрутов
Ссылки на маршруты
Используется компонент <router-link> вместо обычного <a>:
<router-link to="/">На главную</router-link>
<router-link to="/about">О нас</router-link>
Можно использовать навигацию программно:
this.$router.push('/about');
this.$router.push({ name: 'About' });
Отображение маршрута
Компонент <router-view> указывает место, куда будет рендериться компонент текущего маршрута:
<template>
<div>
<Header />
<router-view />
<Footer />
</div>
</template>
История маршрутизации
Vue Router поддерживает разные режимы истории:
createWebHistory() // Использует HTML5 History API (чистые URL)
createWebHashHistory() // URL включает # (hash mode)
createMemoryHistory() // Используется для тестирования или серверного рендеринга
Динамические маршруты
Можно задать параметры в URL:
{
path: '/user/:id',
name: 'User',
component: UserProfile
}
И использовать их внутри компонента:
setup(props) {
const route = useRoute();
const userId = route.params.id;
}
Если компонент использует props: true, параметры можно передать как свойства:
{
path: '/user/:id',
component: UserProfile,
props: true
}
Вложенные маршруты
Для отображения подстраниц внутри родительского компонента:
{
path: '/dashboard',
component: DashboardLayout,
children: \[
{
path: 'settings',
component: Settings
},
{
path: 'profile',
component: Profile
}
\]
}
И внутри DashboardLayout.vue:
<router-view />
Lazy Loading компонентов
Для загрузки компонентов по требованию:
const routes = \[
{
path: '/about',
component: () => import('./views/About.vue')
}
\];
Webpack (или Vite) автоматически создаёт отдельные чанки, что снижает первоначальный размер бандла.
Навигационные защиты (Navigation Guards)
Глобальные Guards
router.beforeEach((to, from, next) => {
if (to.meta.requiresAuth && !auth.isLoggedIn()) {
next('/login');
} else {
next();
}
});
Guards на уровне маршрута
{
path: '/admin',
component: AdminPage,
beforeEnter: (to, from, next) => {
if (store.user.isAdmin) next();
else next('/unauthorized');
}
}
Guards внутри компонентов
beforeRouteEnter(to, from, next) {
next(vm => {
// доступ к экземпляру vm
});
}
beforeRouteUpdate(to, from, next) {
// вызывается при смене параметров маршрута
next();
}
beforeRouteLeave(to, from, next) {
// можно прервать уход со страницы
next();
}
Навигация по имени
this.$router.push({ name: 'User', params: { id: 123 } });
Имя маршрута используется для ссылок и переходов, особенно при наличии динамических параметров.
Обработка несуществующих маршрутов (404)
{
path: '/:pathMatch(.\*)\*',
name: 'NotFound',
component: NotFoundPage
}
Эта запись означает: любой путь, который не был сопоставлен с другими маршрутами.
Props для маршрутов
Vue Router может передавать параметры маршрута в качестве props, что делает компонент более предсказуемым и тестируемым.
{
path: '/user/:id',
component: UserPage,
props: route => ({ id: Number(route.params.id) })
}
Импорт маршрутов из отдельных файлов
В больших проектах маршруты разбивают на модули:
// routes/user.js
export default \[
{
path: '/users',
component: UsersList
},
{
path: '/users/:id',
component: UserProfile
}
\];
// router.js
import userRoutes from './routes/user';
const routes = \[
...userRoutes,
{ path: '/', component: HomePage }
\];
Интеграция с Composition API
Vue Router 4 поддерживает Composition API через хуки:
import { useRouter, useRoute } from 'vue-router';
const router = useRouter();
const route = useRoute();
router.push({ name: 'Home' });
console.log(route.params.id);
useRouter() даёт доступ к маршрутизатору, а useRoute() — к текущему маршруту. Это удобно в <script setup> или setup().
Meta-поля маршрута
Можно задавать метаинформацию для маршрута, например, требования авторизации:
{
path: '/admin',
component: AdminPanel,
meta: {
requiresAuth: true,
title: 'Админ-панель'
}
}
И использовать их в guards или других частях приложения.