Вложенные маршруты (Nested Routes) — это мощная функция Vue Router, позволяющая создавать иерархические структуры маршрутов, где дочерние компоненты отображаются внутри родительских компонентов.
Вложенные маршруты позволяют:
const routes = [
{
path: '/dashboard',
component: DashboardLayout,
children: [
{
path: '', // default child
component: DashboardHome
},
{
path: 'profile',
component: DashboardProfile
},
{
path: 'settings',
component: DashboardSettings
}
]
}
]
Родительский компонент (DashboardLayout.vue
) должен содержать <router-view>
для отображения дочерних компонентов:
<!-- DashboardLayout.vue -->
<template>
<div>
<h1>Панель управления</h1>
<nav>
<router-link to="/dashboard">Главная</router-link>
<router-link to="/dashboard/profile">Профиль</router-link>
<router-link to="/dashboard/settings">Настройки</router-link>
</nav>
<div class="content">
<router-view></router-view> <!-- Здесь будут отображаться дочерние компоненты -->
</div>
</div>
</template>
Дочерние пути указываются относительно родительского:
profile
→ /dashboard/profile
./profile
→ тоже /dashboard/profile
/profile
→ абсолютный путь (не рекомендуется)Дочерние маршруты наследуют параметры родителя:
{
path: '/user/:id',
component: User,
children: [
{
path: 'profile', // будет /user/:id/profile
component: UserProfile
}
]
}
Можно создавать глубокие иерархии:
{
path: '/admin',
component: AdminLayout,
children: [
{
path: 'users',
component: UserManagement,
children: [
{
path: ':id',
component: UserDetails
}
]
}
]
}
{
path: '/admin',
component: AdminLayout,
children: [
{ path: '', component: AdminDashboard },
{ path: 'posts', component: PostList },
{ path: 'posts/:id', component: PostEditor },
{ path: 'users', component: UserList },
{ path: 'users/:id', component: UserProfile }
]
}
{
path: '/account',
component: AccountLayout,
children: [
{ path: '', redirect: 'profile' },
{ path: 'profile', component: Profile },
{ path: 'orders', component: OrderHistory },
{ path: 'settings', component: Settings }
]
}
Можно комбинировать с ленивой загрузкой:
{
path: '/projects',
component: () => import('@/layouts/ProjectLayout.vue'),
children: [
{ path: '', component: () => import('@/views/ProjectList.vue') },
{ path: ':id', component: () => import('@/views/ProjectDetails.vue') }
]
}
Хуки выполняются от родителя к детям:
// В родительском компоненте
beforeRouteEnter(to, from, next) {
console.log('Parent hook')
next()
}
// В дочернем компоненте
beforeRouteEnter(to, from, next) {
console.log('Child hook')
next()
}
// Порядок вывода: Parent hook → Child hook
<router-view>
Используйте вложенные маршруты для: