Компонент v-expansion-panels в
библиотеке Vuetify предназначен для создания интерактивных панелей,
которые могут раскрываться и скрываться по клику пользователя. Он служит
удобным инструментом для организации контента, когда требуется
сэкономить место на странице и одновременно предоставить доступ к
подробной информации.
Базовая структура состоит из двух элементов:
<v-expansion-panels>
<v-expansion-panel>
<v-expansion-panel-header>Заголовок панели</v-expansion-panel-header>
<v-expansion-panel-content>Содержимое панели</v-expansion-panel-content>
</v-expansion-panel>
</v-expansion-panels>
v-expansion-panels — контейнер для
всех панелей.v-expansion-panel — отдельная панель,
включающая заголовок и контент.v-expansion-panel-header — элемент, по
которому осуществляется раскрытие панели.v-expansion-panel-content —
содержимое, отображаемое при открытии панели.С помощью атрибутов multiple и accordion
можно контролировать, сколько панелей может быть открыто
одновременно.
<v-expansion-panels multiple>
<v-expansion-panel>...</v-expansion-panel>
<v-expansion-panel>...</v-expansion-panel>
</v-expansion-panels>
multiple — разрешает открывать
несколько панелей одновременно.accordion — активен по умолчанию;
открыта может быть только одна панель. Одновременное использование
multiple отключает режим аккордеона.v-modelСостояние панелей можно привязать к переменной Vue через
v-model. Это позволяет программно управлять открытием и
закрытием панелей.
<template>
<v-expansion-panels v-model="activePanels">
<v-expansion-panel>
<v-expansion-panel-header>Панель 1</v-expansion-panel-header>
<v-expansion-panel-content>Контент 1</v-expansion-panel-content>
</v-expansion-panel>
<v-expansion-panel>
<v-expansion-panel-header>Панель 2</v-expansion-panel-header>
<v-expansion-panel-content>Контент 2</v-expansion-panel-content>
</v-expansion-panel>
</v-expansion-panels>
</template>
<script>
export default {
data() {
return {
activePanels: [0] // индекс открытой панели
};
}
}
</script>
multiple.Vuetify предоставляет гибкие возможности стилизации панелей:
color и
bg-color.<v-expansion-panel color="primary" bg-color="grey lighten-4">
...
</v-expansion-panel>
actions.<v-expansion-panel-header>
Заголовок
<template #actions>
<v-icon>mdi-chevron-down</v-icon>
</template>
</v-expansion-panel-header>
expand-icon и
слоты.Для генерации панелей из массива данных используется директива
v-for. Это особенно удобно при работе с API или массивами
объектов.
<v-expansion-panels>
<v-expansion-panel v-for="(item, index) in items" :key="index">
<v-expansion-panel-header>{{ item.title }}</v-expansion-panel-header>
<v-expansion-panel-content>{{ item.content }}</v-expansion-panel-content>
</v-expansion-panel>
</v-expansion-panels>
<script>
export default {
data() {
return {
items: [
{ title: 'Панель A', content: 'Содержимое A' },
{ title: 'Панель B', content: 'Содержимое B' },
{ title: 'Панель C', content: 'Содержимое C' },
]
};
}
}
</script>
v-expansion-panels легко интегрируется с любыми
Vuetify-компонентами:
<v-card> для визуального объединения элементов.<v-list> или <v-data-table>.<v-form> внутри панели
позволяет скрывать сложные формы и раскрывать их только по
необходимости.Компонент поддерживает несколько полезных событий:
@change — вызывается при изменении
активной панели.@update:model-value — аналог
v-model, позволяет реагировать на изменение индекса
открытых панелей.<v-expansion-panels v-model="activePanels" @change="panelChanged">
...
</v-expansion-panels>
<script>
export default {
methods: {
panelChanged(newIndex) {
console.log('Активная панель:', newIndex);
}
}
}
</script>
Vuetify автоматически заботится об адаптивности панелей:
lazy
позволяет загружать контент панели только при её открытии, снижая
нагрузку на страницу.value или v-model можно определить, какие
панели должны быть открыты при загрузке.v-expansion-panel можно оформлять индивидуально с помощью
классов, слотов и цветовых пропов.<v-expansion-panel class="custom-panel" bg-color="blue lighten-5">
...
</v-expansion-panel>
Эта гибкость делает v-expansion-panels мощным
инструментом для создания сложных и динамичных интерфейсов с компактной
организацией информации.