QDialog — это компонент библиотеки Quasar, предназначенный для создания модальных окон. Модальные окна блокируют взаимодействие с основной страницей до тех пор, пока пользователь не закроет диалог, что позволяет реализовать подтверждения действий, формы ввода, предупреждения и другие интерактивные элементы.
QDialog может использоваться в двух основных режимах: императивном и декларативном.
В декларативном подходе QDialog добавляется напрямую в шаблон компонента Vue. Управление его видимостью осуществляется через привязку к переменной состояния:
<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="Отмена" v-close-popup />
<q-btn flat label="OK" color="primary" @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>
Ключевые моменты декларативного подхода:
v-model связывает видимость диалога с
переменной состояния.v-close-popup закрывает диалог автоматически без
необходимости вручную изменять переменную.Императивный способ подходит для вызова модальных окон из методов без
предварительного размещения их в шаблоне. Используется статический метод
this.$q.dialog().
methods: {
showDialog() {
this.$q.dialog({
title: 'Подтверждение',
message: 'Вы действительно хотите удалить элемент?',
cancel: true,
persistent: true
}).onOk(() => {
console.log('Элемент удалён');
}).onCancel(() => {
console.log('Действие отменено');
}).onDismiss(() => {
console.log('Диалог закрыт');
});
}
}
Особенности императивного вызова:
title,
message, html, ok,
cancel, persistent.onOk, onCancel,
onDismiss позволяют отслеживать действия пользователя.persistent: true делает диалог неприкосновенным к клику
вне окна, что полезно для предупреждений.QDialog поддерживает широкие возможности кастомизации:
Размеры и положение:
maximized – диалог занимает весь экран.full-width / full-height – растягивает по
ширине или высоте.position – задаёт позицию диалога (top,
center, bottom).this.$q.dialog({
title: 'Диалог снизу',
message: 'Пример позиционирования',
position: 'bottom'
});
Постоянство:
persistent предотвращает закрытие кликом вне диалога
или клавишей Escape.no-backdrop-dismiss для полного
контроля поведения.Анимации:
transition-show и transition-hide
позволяют задать собственные эффекты появления и исчезновения.<q-dialog v-model="dialog" transition-show="scale" transition-hide="fade">
...
</q-dialog>
QDialog может содержать другой QDialog, что полезно для многоступенчатых форм:
<q-dialog v-model="step1">
<q-card>
<q-card-section>Шаг 1</q-card-section>
<q-card-actions>
<q-btn flat label="Далее" @click="step2 = true; step1 = false" />
</q-card-actions>
</q-card>
</q-dialog>
<q-dialog v-model="step2">
<q-card>
<q-card-section>Шаг 2</q-card-section>
<q-card-actions>
<q-btn flat label="Закрыть" v-close-popup />
</q-card-actions>
</q-card>
</q-dialog>
Особенности:
QDialog часто используется для форм ввода данных. Для этого:
<q-dialog v-model="dialog">
<q-card>
<q-card-section>
<q-input v-model="name" label="Имя" :rules="[val => !!val || 'Обязательное поле']" />
</q-card-section>
<q-card-actions align="right">
<q-btn flat label="Отмена" v-close-popup />
<q-btn flat label="Сохранить" @click="submitForm" />
</q-card-actions>
</q-card>
</q-dialog>
submitForm проверяет валидность и выполняет
обработку данных.QDialog — гибкий инструмент, позволяющий создавать интерактивные модальные окна с любым контентом, управлять их поведением и стилем, а также интегрировать с формами и многоступенчатыми интерфейсами. Такой подход обеспечивает высокую степень контроля над пользовательским опытом и структурой приложения в Quasar.