Vue Router позволяет организовывать маршруты приложения и управлять
отображением компонентов в зависимости от URL. Один из мощных
инструментов библиотеки — вложенные маршруты, которые
настраиваются через свойство children в конфигурации
маршрутов. Этот механизм обеспечивает создание сложной структуры
страниц, сохраняя при этом чистую иерархию компонентов.
В конфигурации маршрутов свойство children используется
для указания вложенных маршрутов относительно родительского. Структура
маршрутов становится деревообразной:
import { createRouter, createWebHistory } from 'vue-router'
import Parent from './components/Parent.vue'
import ChildA from './components/ChildA.vue'
import ChildB from './components/ChildB.vue'
const routes = [
{
path: '/parent',
component: Parent,
children: [
{
path: 'child-a',
component: ChildA
},
{
path: 'child-b',
component: ChildB
}
]
}
]
const router = createRouter({
history: createWebHistory(),
routes
})
export default router
Ключевые моменты:
/parent/child-a формируется автоматически.<router-view>, куда будут рендериться дочерние
компоненты.Дочерние маршруты могут быть динамическими, используя синтаксис параметров:
{
path: '/parent',
component: Parent,
children: [
{
path: 'item/:id',
component: ChildA,
props: true
}
]
}
:id становится доступен через объект
route.params.props: true позволяет передавать параметр как
пропс в компонент, упрощая работу с данными.Именованные маршруты облегчают навигацию и генерацию ссылок через
router-link или программно:
{
path: '/parent',
component: Parent,
children: [
{
path: 'child-a',
name: 'child-a',
component: ChildA
}
]
}
Навигация через name:
router.push({ name: 'child-a' })
Или в шаблоне:
<router-link :to="{ name: 'child-a' }">Перейти к Child A</router-link>
По умолчанию путь дочернего маршрута относительный, но можно использовать абсолютный путь:
{
path: '/parent',
component: Parent,
children: [
{
path: '/special',
component: ChildB
}
]
}
/special) игнорирует путь
родителя.Можно создавать маршруты с глубокой вложенностью:
{
path: '/parent',
component: Parent,
children: [
{
path: 'child-a',
component: ChildA,
children: [
{
path: 'grandchild',
component: () => import('./components/GrandChild.vue')
}
]
}
]
}
<router-view> в родительском компоненте.Вложенные маршруты могут работать совместно с именованными
областями (named views), что позволяет отображать
несколько компонентов одновременно:
{
path: '/parent',
components: {
default: Parent,
sidebar: Sidebar
},
children: [
{
path: 'child-a',
components: {
default: ChildA,
sidebar: ChildSidebar
}
}
]
}
<router-view name="имя"> в родительском
компоненте.Для оптимизации загрузки приложения дочерние компоненты можно загружать лениво:
{
path: 'child-a',
component: () => import('./components/ChildA.vue')
}
Дочерние маршруты наследуют навигацию от родителя. Возможны несколько сценариев:
router.push('/parent/child-a') или по имени.<router-link>:
используется относительный путь или имя.<router-view> обновляется без перезагрузки всей
страницы.<router-view>.<router-view>.Хотите, я подготовлю наглядную схему вложенных
маршрутов с примером работы <router-view> и
динамических children для наглядного учебника? Это сильно помогает
понять структуру.