Quasar предоставляет мощный набор компонентов для работы с нативными меню и диалогами, позволяя создавать удобный и единообразный пользовательский интерфейс на всех платформах. Основными инструментами для реализации интерактивных окон и контекстных меню являются компоненты QMenu, QDialog, QPopupEdit, QContextMenu и встроенные утилиты для уведомлений и подтверждений.
QMenu используется для создания выпадающих меню и контекстных списков. Меню может быть прикреплено к любому элементу страницы и открываться по клику или наведению.
Пример базового меню:
<template>
<q-btn label="Меню" @click="menu = true" />
<q-menu v-model="menu">
<q-list>
<q-item clickable v-ripple @click="action('Первый пункт')">
<q-item-section>Первый пункт</q-item-section>
</q-item>
<q-item clickable v-ripple @click="action('Второй пункт')">
<q-item-section>Второй пункт</q-item-section>
</q-item>
</q-list>
</q-menu>
</template>
<script>
export default {
data() {
return {
menu: false
};
},
methods: {
action(item) {
console.log(item);
this.menu = false;
}
}
};
</script>
Ключевые моменты QMenu:
QItem с
QMenu внутри.QDialog используется для создания модальных окон с возможностью ввода данных, подтверждения действий или отображения информации. Диалоги могут быть статичными или динамическими.
Пример простого диалога:
<template>
<q-btn label="Открыть диалог" @click="dialog = true" />
<q-dialog v-model="dialog">
<q-card>
<q-card-section>
Подтвердите действие
</q-card-section>
<q-card-actions align="right">
<q-btn flat label="Отмена" @click="dialog = false" />
<q-btn flat label="OK" @click="confirmAction" />
</q-card-actions>
</q-card>
</q-dialog>
</template>
<script>
export default {
data() {
return { dialog: false };
},
methods: {
confirmAction() {
console.log('Действие подтверждено');
this.dialog = false;
}
}
};
</script>
Особенности QDialog:
QPopupEdit сочетает возможности меню и диалогов, позволяя редактировать значения прямо на странице без перехода на отдельную форму.
Пример редактирования текста:
<template>
<q-input filled v-model="text">
<template v-slot:append>
<q-popup-edit v-model="text" auto-save>
<q-input v-model="text" autofocus />
</q-popup-edit>
</template>
</q-input>
</template>
<script>
export default {
data() {
return { text: 'Редактируемый текст' };
}
};
</script>
Преимущества QPopupEdit:
auto-save.Для реактивных контекстных меню используется комбинация
QMenu и пользовательских событий
@contextmenu. Это позволяет создать нативное поведение
правого клика с кастомной логикой.
<template>
<div @contextmenu.prevent="openMenu($event)">
Правый клик по этому блоку
</div>
<q-menu v-model="menu" :anchor="anchor" self="top left">
<q-list>
<q-item clickable v-ripple @click="action('Удалить')">
<q-item-section>Удалить</q-item-section>
</q-item>
<q-item clickable v-ripple @click="action('Копировать')">
<q-item-section>Копировать</q-item-section>
</q-item>
</q-list>
</q-menu>
</template>
<script>
export default {
data() {
return {
menu: false,
anchor: { top: 0, left: 0 }
};
},
methods: {
openMenu(event) {
this.anchor = { top: event.clientY, left: event.clientX };
this.menu = true;
},
action(name) {
console.log(name);
this.menu = false;
}
}
};
</script>
Особенности:
Для быстрого создания диалогов и уведомлений можно использовать глобальные методы q.dialog * *и * *q.notify.
Пример подтверждения:
this.$q.dialog({
title: 'Удаление',
message: 'Вы действительно хотите удалить элемент?',
cancel: true,
persistent: true
}).onOk(() => {
console.log('Элемент удален');
}).onCancel(() => {
console.log('Удаление отменено');
});
Пример уведомления:
this.$q.notify({
type: 'positive',
message: 'Данные успешно сохранены',
position: 'top-right',
timeout: 3000
});
Преимущества использования глобальных методов:
@contextmenu с
prevent.Эти инструменты позволяют создавать интуитивно понятные, отзывчивые интерфейсы с нативным поведением на всех устройствах.