Компонент QMenu представляет собой контекстное или всплывающее меню, которое может быть привязано к любому элементу на странице. Основная задача QMenu — предоставление пользователю набора действий или опций, связанных с конкретным элементом интерфейса. В Quasar меню строится через сочетание компонентов QMenu и QList, что позволяет создавать гибкие и настраиваемые контекстные меню.
<q-btn label="Открыть меню" ref="menuBtn" @click="menu = true" />
<q-menu v-model="menu" anchor="bottom left" self="top left">
<q-list>
<q-item clickable v-ripple @click="action1">
<q-item-section>Действие 1</q-item-section>
</q-item>
<q-item clickable v-ripple @click="action2">
<q-item-section>Действие 2</q-item-section>
</q-item>
</q-list>
</q-menu>
Для создания контекстного меню, привязанного к конкретной кнопке или любому другому элементу, используется директива ref и событие @click или @contextmenu.
<div @contextmenu.prevent="menu = true; $refs.menuBtn = $event">
Клик правой кнопкой для открытия меню
</div>
<q-menu v-model="menu" :context-menu="$refs.menuBtn">
<q-list>
<q-item clickable v-ripple @click="editItem">
<q-item-section>Редактировать</q-item-section>
</q-item>
<q-item clickable v-ripple @click="deleteItem">
<q-item-section>Удалить</q-item-section>
</q-item>
</q-list>
</q-menu>
Часто требуется строить меню на основе массива данных. Для этого используется директива v-for:
<q-menu v-model="menu">
<q-list>
<q-item v-for="item in menuItems" :key="item.label" clickable v-ripple @click="item.action">
<q-item-section>{{ item.label }}</q-item-section>
</q-item>
</q-list>
</q-menu>
data() {
return {
menu: false,
menuItems: [
{ label: 'Сохранить', action: this.saveFile },
{ label: 'Открыть', action: this.openFile },
{ label: 'Закрыть', action: this.closeFile }
]
}
}
QMenu поддерживает множество параметров для стилизации:
<q-menu v-model="menu" transition-show="scale" transition-hide="fade" max-height="300px">
<q-list>
<q-item clickable v-ripple @click="download">
<q-item-section>Скачать</q-item-section>
</q-item>
</q-list>
</q-menu>
Для создания подменю можно использовать QItem с QMenu внутри:
<q-menu v-model="menu">
<q-list>
<q-item clickable v-ripple>
<q-item-section>Файл</q-item-section>
<q-menu auto-close>
<q-list>
<q-item clickable @click="newFile">
<q-item-section>Новый</q-item-section>
</q-item>
<q-item clickable @click="openFile">
<q-item-section>Открыть</q-item-section>
</q-item>
</q-list>
</q-menu>
</q-item>
</q-list>
</q-menu>
QMenu предоставляет события для более точного контроля:
methods: {
onMenuShow() {
console.log('Меню открыто');
},
onMenuHide() {
console.log('Меню закрыто');
}
}
<q-menu v-model="menu" @show="onMenuShow" @hide="onMenuHide">
...
</q-menu>
QMenu корректно работает на мобильных устройствах и поддерживает сенсорное управление. Параметры cover и offset позволяют адаптировать меню под различные размеры экрана и положение элементов.
<q-menu v-model="menu" cover :offset="[10, 20]">
<q-list>
<q-item clickable @click="share">
<q-item-section>Поделиться</q-item-section>
</q-item>
</q-list>
</q-menu>
QMenu является мощным инструментом для создания интерактивных интерфейсов, позволяя строить простые и сложные контекстные меню с гибкой кастомизацией и поддержкой динамических данных.