QResizeObserver — это компонент библиотеки Quasar Framework, предназначенный для отслеживания изменений размеров элементов DOM. Он работает как обёртка над стандартным ResizeObserver браузера, предоставляя удобный интерфейс для реактивного управления размерами в приложениях на Vue.js.
QResizeObserver импортируется из пакета Quasar и используется внутри шаблона:
<template>
<div>
<q-resize-observer @resize="onResize" />
</div>
</template>
<script setup>
import { ref } from 'vue'
import { QResizeObserver } from 'quasar'
const width = ref(0)
const height = ref(0)
function onResize({ width: w, height: h }) {
width.value = w
height.value = h
}
</script>
Разбор кода:
@resize — событие, которое срабатывает при изменении
размеров родительского элемента.{ width, height }.ref для дальнейшего использования в шаблоне или
логике.QResizeObserver можно привязать к конкретному элементу, используя
слот default:
<q-resize-observer @resize="handleResize">
<template #default="{ width, height }">
<div :style="{ width: width + 'px', height: height + 'px' }">
Размеры: {{ width }} x {{ height }}
</div>
</template>
</q-resize-observer>
Особенности:
QResizeObserver отлично сочетается с Composition API Vue 3:
<script setup>
import { ref } from 'vue'
const elementSize = ref({ width: 0, height: 0 })
function updateSize(size) {
elementSize.value = size
}
</script>
<template>
<q-resize-observer @resize="updateSize" />
<p>Ширина: {{ elementSize.width }}, Высота: {{ elementSize.height }}</p>
</template>
elementSize хранит актуальные значения
размеров.Свойства QResizeObserver:
debounce — задаёт задержку в миллисекундах перед
срабатыванием события resize. Полезно при частых изменениях
размеров.observeParents — позволяет отслеживать изменения
размеров не только элемента, но и его родительских контейнеров.disabled — временно отключает наблюдение.Слоты:
default — предоставляет реактивные значения
width и height, чтобы использовать их внутри
шаблона напрямую.<q-resize-observer v-slot="{ width }">
<q-card :style="{ width: width / 3 + 'px' }">Контент</q-card>
</q-resize-observer>
<q-resize-observer @resize="resizeText">
<div :style="{ fontSize: fontSize + 'px' }">
Текст под размер контейнера
</div>
</q-resize-observer>
<script setup>
import { ref } from 'vue'
const fontSize = ref(14)
function resizeText({ width }) {
fontSize.value = Math.max(12, width / 20)
}
</script>
debounce помогает снизить нагрузку.ResizeObserver. Для старых
браузеров требуется полифилл.<q-resize-observer
:debounce="100"
:observe-parents="true"
@resize="onResize"
>
<template #default="{ width, height }">
<div :style="{ width: width + 'px', height: height + 'px' }">
{{ width }} x {{ height }}
</div>
</template>
</q-resize-observer>
default обеспечивает полный
контроль над отображением и поведением элементов.