Quasar — это высокоуровневая библиотека для Vue.js, которая упрощает создание кроссплатформенных приложений. Несмотря на наличие компонентов с готовой логикой, часто возникает необходимость напрямую манипулировать DOM-элементами. Quasar предоставляет несколько инструментов и паттернов для безопасного и эффективного взаимодействия с DOM.
refВ Vue 3 (на котором построен Quasar) доступ к элементам DOM
осуществляется через директиву ref.
Пример использования:
<template>
<div>
<q-btn label="Изменить текст" @click="changeText" />
<p ref="paragraph">Исходный текст</p>
</div>
</template>
<script setup>
import { ref } from 'vue'
const paragraph = ref(null)
function changeText() {
if (paragraph.value) {
paragraph.value.textContent = 'Текст изменён'
}
}
</script>
Ключевые моменты:
ref создаёт реактивную ссылку на DOM-элемент..value.null обязательна, так как элемент может
быть ещё не смонтирован.v-bind и динамические атрибутыДля динамического управления классами и стилями используются
стандартные Vue-инструменты: v-bind:class и
v-bind:style.
<template>
<q-btn
:class="{ 'bg-positive': isActive }"
:style="{ fontSize: fontSize + 'px' }"
label="Кнопка"
@click="toggleActive"
/>
</template>
<script setup>
import { ref } from 'vue'
const isActive = ref(false)
const fontSize = ref(16)
function toggleActive() {
isActive.value = !isActive.value
fontSize.value += 2
}
</script>
Особенности:
document.querySelector.Quasar рекомендует использовать встроенные методы Vue для событий, однако прямое добавление слушателей к DOM тоже возможно.
<template>
<div ref="container">Наведите курсор</div>
</template>
<script setup>
import { onMounted, ref, onBeforeUnmount } from 'vue'
const container = ref(null)
function handleMouseOver() {
container.value.style.backgroundColor = '#f0f0f0'
}
onMounted(() => {
if (container.value) {
container.value.addEventListener('mouseover', handleMouseOver)
}
})
onBeforeUnmount(() => {
if (container.value) {
container.value.removeEventListener('mouseover', handleMouseOver)
}
})
</script>
Рекомендации:
onBeforeUnmount для
предотвращения утечек памяти.@mouseover) для более чистого
кода, если это возможно.Quasar компоненты скрывают внутренние DOM-элементы, поэтому прямой
доступ к ним требует использования ref на обёртке или
getElement через $el:
<template>
<q-input ref="input" label="Имя пользователя" />
</template>
<script setup>
import { ref, onMounted } from 'vue'
const input = ref(null)
onMounted(() => {
// Получение реального input внутри q-input
const nativeInput = input.value.$el.querySelector('input')
nativeInput.focus()
})
</script>
Важно:
$el предоставляет доступ к корневому DOM-элементу
компонента.nextTick для безопасного изменения DOMИзменения реактивных данных могут быть асинхронными. Для безопасной
работы с DOM после обновления состояния применяется
nextTick:
import { nextTick, ref } from 'vue'
const message = ref('Старый текст')
function updateMessage() {
message.value = 'Новый текст'
nextTick(() => {
const paragraph = document.querySelector('p')
paragraph.style.color = 'red'
})
}
Задачи nextTick:
Иногда требуется создать элементы программно, минуя шаблон. В Quasar это делается стандартным DOM API:
const newDiv = document.createElement('div')
newDiv.textContent = 'Новый блок'
newDiv.classList.add('q-pa-md', 'bg-grey-3')
document.body.appendChild(newDiv)
Советы:
q-), чтобы
сохранить единый стиль приложения.v-for.Quasar интегрирует Vue Transition и CSS классы для анимаций:
<template>
<transition name="fade">
<div v-if="show" class="q-pa-md bg-primary text-white">
Появляющийся блок
</div>
</transition>
<q-btn label="Toggle" @click="show = !show" />
</template>
<script setup>
import { ref } from 'vue'
const show = ref(false)
</script>
<style>
.fade-enter-active, .fade-leave-active {
transition: opacity 0.5s;
}
.fade-enter-from, .fade-leave-to {
opacity: 0;
}
</style>
Выводы:
transition позволяет безопасно управлять
появлением и исчезновением DOM-элементов.ref и nextTick для синхронизации
с реальным DOM.onMounted и
onBeforeUnmount с добавлением/удалением слушателей.q-) и атрибуты.Эти методы обеспечивают стабильную и безопасную работу с DOM в масштабных Quasar-приложениях, сохраняя преимущества реактивности Vue.