Vue Router позволяет определять множественные
представления на одной странице с помощью концепции
именованных представлений. Это расширяет возможности
стандартного <router-view> и позволяет отображать
несколько компонентов одновременно в разных областях интерфейса.
Именованные представления создаются с использованием объекта
components вместо единственного свойства
component при определении маршрута:
const routes = [
{
path: '/dashboard',
components: {
default: DashboardMain,
sidebar: DashboardSidebar,
footer: DashboardFooter
}
}
];
В этом примере маршрут /dashboard будет отображать:
<router-view> без имени<router-view name="sidebar"><router-view name="footer">Для работы с именованными представлениями необходимо использовать
атрибут name у компонента
<router-view>:
<template>
<div class="dashboard-layout">
<router-view></router-view> <!-- default -->
<router-view name="sidebar"></router-view>
<router-view name="footer"></router-view>
</div>
</template>
Ключевое отличие от обычного маршрута заключается в том, что каждое имя соответствует отдельному компоненту маршрута.
Именованные представления позволяют динамически менять содержимое каждой зоны интерфейса. Например, можно оставить один компонент постоянным, а другой менять в зависимости от маршрута:
const routes = [
{
path: '/user/:id',
components: {
default: UserProfile,
sidebar: UserSidebar
}
},
{
path: '/user/:id/settings',
components: {
default: UserSettings,
sidebar: UserSidebar
}
}
];
В данном случае sidebar остаётся неизменным, а основной
контент (default) меняется при переходе между
/user/:id и /user/:id/settings.
Именованные представления могут использоваться внутри
вложенных маршрутов. Для этого в родительском маршруте
задается <router-view> с именем, а дочерние маршруты
используют соответствующие компоненты:
const routes = [
{
path: '/account',
components: { default: AccountLayout, sidebar: AccountSidebar },
children: [
{
path: 'profile',
components: { default: ProfileMain, sidebar: ProfileSidebar }
},
{
path: 'security',
components: { default: SecurityMain, sidebar: SecuritySidebar }
}
]
}
];
Здесь при переходе по /account/profile изменяется как
основной контент, так и боковая панель, без необходимости полностью
перерисовывать родительский макет.
Для перехода между маршрутами с именованными представлениями
используется стандартный <router-link> или
программная навигация:
<router-link :to="{ path: '/dashboard' }">Dashboard</router-link>
или
this.$router.push({ path: '/dashboard' });
В объекте path или name можно указывать
параметры маршрута, а Vue Router корректно отобразит все именованные
представления, определённые для маршрута.
name у <router-view> должен
совпадать с ключом объекта components маршрута.Именованные представления поддерживают передачу пропсов через маршрут:
const routes = [
{
path: '/products/:id',
components: { default: ProductMain, sidebar: ProductSidebar },
props: {
default: true,
sidebar: route => ({ highlighted: route.params.id })
}
}
];
В этом примере основной компонент получает стандартный проп
id, а боковая панель получает объект с
highlighted, позволяя выделять текущий продукт в
списке.
Именованные представления можно оборачивать в
<transition> или
<transition-group> для анимаций:
<transition name="fade">
<router-view name="sidebar"></router-view>
</transition>
Таким образом, Vue Router позволяет создавать сложные, настраиваемые интерфейсы с несколькими зонами контента, сохраняя чистую структуру маршрутов и упрощая поддержку кода.
Именованные представления остаются одним из самых мощных инструментов Vue Router, обеспечивая гибкость и модульность при разработке многоуровневых приложений.