QPopupProxy в библиотеке Quasar представляет собой
мощный инструмент для создания универсальных попапов, которые могут
использоваться как модальные окна, тултипы, выпадающие списки и
контекстные меню. Главная особенность QPopupProxy — это его
гибкость позиционирования и возможность связывать попап
с любым элементом на странице, сохраняя при этом управление видимостью
через реактивные свойства Vue.
<template>
<q-btn label="Открыть попап" @click="popup = true" />
<q-popup-proxy v-model="popup" transition-show="scale" transition-hide="scale">
<q-card>
<q-card-section>Содержимое попапа</q-card-section>
</q-card>
</q-popup-proxy>
</template>
<script>
export default {
data() {
return {
popup: false
};
}
};
</script>
В этом примере v-model управляет состоянием видимости, а
атрибуты transition-show и transition-hide
задают анимацию появления и скрытия попапа.
QPopupProxy может позиционироваться относительно
любого DOM-элемента с помощью свойства
anchor. Это делает его идеальным для создания выпадающих
меню и подсказок, которые должны точно следовать за элементом
интерфейса.
<q-btn label="Меню" ref="menuBtn" @click="menu = !menu" />
<q-popup-proxy v-model="menu" :anchor="$refs.menuBtn">
<q-list>
<q-item clickable v-close-popup>
<q-item-section>Пункт 1</q-item-section>
</q-item>
<q-item clickable v-close-popup>
<q-item-section>Пункт 2</q-item-section>
</q-item>
</q-list>
</q-popup-proxy>
Ключевые моменты:
ref элемента позволяет ссылаться на него из
anchor.v-close-popup.QPopupProxy предоставляет широкий набор свойств
для точной настройки позиции:
self — позиция попапа относительно его якоря (top,
bottom, left, right, center).fit — заставляет попап подстраиваться по размеру якоря
(например, ширина кнопки).offset — смещение по осям X и Y.cover — делает попап “накрывающим” якорь.<q-popup-proxy
v-model="menu"
:anchor="$refs.menuBtn"
self="top"
fit
:offset="[0, 10]"
>
<q-card>
<q-card-section>Подсказка с отступом</q-card-section>
</q-card>
</q-popup-proxy>
Использование этих свойств позволяет создавать сложные интерфейсы с динамическим позиционированием, подходящие под разные размеры экранов.
QPopupProxy умеет реагировать на стандартные
события:
click — открытие/закрытие при клике.hover — попап появляется при наведении.contextmenu — открытие по правому клику.Пример использования hover-триггера:
<q-btn label="Наведи на меня" />
<q-popup-proxy v-model="hoverPopup" anchor="$refs.hoverBtn" transition-show="jump-down" transition-hide="jump-up" target="hover">
<q-card>
<q-card-section>Появление при наведении</q-card-section>
</q-card>
</q-popup-proxy>
Дополнительно можно использовать свойство
persistent, чтобы попап не закрывался
автоматически при клике вне него, что полезно для модальных форм или
настроек.
На мобильных устройствах важно учитывать, что экран ограничен.
QPopupProxy позволяет:
max-height,
max-width).cover для создания полноэкранных
всплывающих элементов.transition-show и
transition-hide, даже на touch-устройствах.Пример полноэкранного модального окна на мобильном:
<q-popup-proxy v-model="mobilePopup" cover transition-show="slide-up" transition-hide="slide-down">
<q-card class="q-pa-md">
<q-card-section>Мобильная панель</q-card-section>
<q-btn label="Закрыть" color="primary" v-close-popup />
</q-card>
</q-popup-proxy>
QPopupProxy поддерживает вложенность,
что полезно для контекстных меню с подменю:
<q-popup-proxy v-model="parentMenu" anchor="$refs.menuBtn">
<q-list>
<q-item clickable @click="childMenu = true">
<q-item-section>Открыть подменю</q-item-section>
</q-item>
</q-list>
</q-popup-proxy>
<q-popup-proxy v-model="childMenu" anchor="$refs.menuBtn" self="right">
<q-list>
<q-item clickable v-close-popup>Подпункт 1</q-item>
<q-item clickable v-close-popup>Подпункт 2</q-item>
</q-list>
</q-popup-proxy>
Использование реактивных свойств Vue делает возможным динамическое управление содержимым попапа, включая загрузку данных с сервера и рендеринг сложных компонентов внутри.
Попапы могут быть полностью стилизованы через CSS-классы и встроенные темы Quasar:
class и content-class для обертки
попапа.style и content-style для
inline-настроек.q-dark и
q-light.<q-popup-proxy v-model="popup" class="bg-grey-1" content-class="text-blue">
<q-card>
<q-card-section>Стилизация попапа</q-card-section>
</q-card>
</q-popup-proxy>
Эти возможности позволяют создавать попапы, которые идеально вписываются в любой дизайн системы.
QPopupProxy становится центральным инструментом при
проектировании интерактивных и адаптивных интерфейсов,
объединяя удобство работы с модальными окнами и контекстными меню в
одном компоненте.