В Vue Router структура маршрутов может быть иерархической. Вложенные
маршруты позволяют создавать сложные интерфейсы с несколькими уровнями
навигации, сохраняя при этом согласованную маршрутизацию и управление
состоянием компонентов. Каждый вложенный маршрут определяет
дочерние компоненты, которые рендерятся внутри
родительского компонента с использованием
<router-view>.
const routes = [
{
path: '/dashboard',
component: DashboardLayout,
children: [
{
path: 'overview',
component: OverviewPage
},
{
path: 'settings',
component: SettingsPage
}
]
}
];
В данном примере /dashboard/overview и
/dashboard/settings являются дочерними маршрутами
/dashboard. Родительский компонент
DashboardLayout содержит <router-view>,
в котором будут отображаться дочерние компоненты в зависимости от
активного маршрута.
<router-view> и его рольКлючевым элементом вложенной маршрутизации является
<router-view>. Он работает как контейнер для
рендеринга компонентов, связанных с текущим маршрутом. При использовании
вложенных маршрутов каждый родительский компонент может иметь
собственный <router-view>, позволяя
создавать многоуровневую структуру отображения.
<template>
<div>
<header>Dashboard Header</header>
<router-view></router-view> <!-- Рендер дочерних компонентов -->
<footer>Dashboard Footer</footer>
</div>
</template>
Если дочерний маршрут имеет свои собственные вложенные маршруты,
<router-view> внутри дочернего компонента также может
быть использован для их отображения, обеспечивая многоуровневое
управление.
Вложенные маршруты используют относительные пути по умолчанию, что позволяет легче управлять структурой URL. Например:
children: [
{ path: 'profile', component: ProfilePage },
{ path: 'messages', component: MessagesPage }
]
Здесь полный URL для этих маршрутов будет
/dashboard/profile и /dashboard/messages. Если
указать путь с / в начале (path: '/profile'),
это будет абсолютный путь, который не учитывает
родительский маршрут и будет доступен как /profile.
Вложенные маршруты могут содержать динамические параметры, что позволяет создавать детализированные страницы:
{
path: '/users',
component: UsersLayout,
children: [
{ path: ':id', component: UserDetails },
{ path: ':id/edit', component: UserEdit }
]
}
В этом примере доступ к конкретному пользователю осуществляется через
/users/123, а редактирование — через
/users/123/edit. Компоненты UserDetails и
UserEdit могут использовать $route.params.id
для получения динамического значения id.
Vue Router поддерживает именованные представления,
что особенно полезно при работе с вложенными маршрутами. Это позволяет
рендерить несколько компонентов в разные
<router-view> одновременно:
const routes = [
{
path: '/dashboard',
components: {
default: DashboardMain,
sidebar: DashboardSidebar
},
children: [
{
path: 'reports',
components: {
default: ReportsPage,
sidebar: ReportsSidebar
}
}
]
}
];
В родительском компоненте можно использовать именованные
<router-view>:
<router-view></router-view>
<router-view name="sidebar"></router-view>
Это обеспечивает гибкость в отображении разных частей интерфейса для каждого маршрута.
Вложенные маршруты могут иметь редиректы или алиасы для упрощения навигации:
{
path: '/dashboard',
component: DashboardLayout,
children: [
{ path: '', redirect: 'overview' }, // Автоматический редирект на overview
{ path: 'stats', component: StatsPage, alias: 'analytics' } // stats и analytics ведут к одному компоненту
]
}
Редирект полезен для маршрутов по умолчанию, а alias позволяет создавать альтернативные пути для одного и того же компонента.
Vue Router предоставляет навигационные хуки на уровне компонента и маршрута. Для вложенных маршрутов можно использовать:
beforeEnter на уровне маршрутаbeforeRouteEnter, beforeRouteUpdate,
beforeRouteLeave на уровне компонента{
path: '/dashboard/settings',
component: SettingsPage,
beforeEnter: (to, from, next) => {
if (!isAdmin()) next('/dashboard/overview')
else next()
}
}
Это позволяет управлять доступом к дочерним маршрутам и контролировать переходы в сложной иерархии.
Для оптимизации загрузки больших приложений дочерние компоненты можно загружать лениво с использованием динамического импорта:
const routes = [
{
path: '/dashboard',
component: () => import('./DashboardLayout.vue'),
children: [
{
path: 'overview',
component: () => import('./OverviewPage.vue')
}
]
}
];
Ленивая загрузка снижает первоначальный вес приложения и ускоряет загрузку страниц, особенно при глубокой вложенности маршрутов.
Вложенные маршруты часто объединяют все описанные возможности: динамические параметры, редиректы, именованные виды и ленивую загрузку. Это позволяет строить многоуровневые, гибкие интерфейсы без дублирования кода и с полным контролем над навигацией.
Эффективное использование вложенной структуры маршрутов делает приложения на Vue более модульными и удобными для масштабирования.