Директива v-click-outside предназначена для отслеживания
кликов вне определённого элемента и выполнения заданной функции при
срабатывании такого события. Она особенно полезна для реализации
интерактивных компонентов, таких как выпадающие меню, модальные окна,
тултипы и автокомплиты, где необходимо скрывать элемент при клике за его
пределами.
Vuetify предоставляет встроенную поддержку директивы
v-click-outside, которая может быть применена к любому
компоненту Vue. Основная форма использования выглядит следующим
образом:
<template>
<div v-click-outside="handleOutsideClick">
<v-menu v-model="menuVisible" :close-on-content-click="false">
<template #activator="{ props }">
<v-btn v-bind="props">Открыть меню</v-btn>
</template>
<v-list>
<v-list-item v-for="item in items" :key="item">
{{ item }}
</v-list-item>
</v-list>
</v-menu>
</div>
</template>
<script>
export default {
data() {
return {
menuVisible: false,
items: ['Пункт 1', 'Пункт 2', 'Пункт 3']
}
},
methods: {
handleOutsideClick() {
this.menuVisible = false;
}
}
}
</script>
В этом примере при клике за пределами элемента
<div> вызывается метод
handleOutsideClick, который закрывает меню.
v-click-outside.v-menu, v-dialog,
v-tooltip, v-autocomplete и другими
интерактивными элементами.Директива v-click-outside поддерживает несколько
полезных опций:
true или false, которая позволяет
контролировать выполнение callback. Например, можно
игнорировать клики по определённым дочерним элементам.['click'], но можно добавить
['click', 'touchstart'] для поддержки мобильных
устройств.Пример с использованием middleware и кастомного события:
<div
v-click-outside="{
callback: closeDialog,
middleware: shouldIgnoreClick,
events: ['click', 'touchstart']
}"
>
<v-dialog v-model="dialogVisible">
<!-- Контент диалога -->
</v-dialog>
</div>
<script>
export default {
methods: {
closeDialog() {
this.dialogVisible = false;
},
shouldIgnoreClick(event) {
// Игнорировать клики по кнопке "Сохранить"
return event.target.closest('.save-button') ? false : true;
}
}
}
</script>
v-click-outside позволяет закрывать v-menu при
клике вне его области, улучшая UX.v-dialog обеспечивает естественное поведение диалогов без
необходимости вручную отслеживать глобальные события клика.v-click-outside на обертке элемента, а не
на самом интерактивном компоненте, чтобы избежать конфликтов с
внутренними событиями.middleware для
исключения нежелательных срабатываний.touchstart для
корректного отслеживания касаний.В Vue 3 директива v-click-outside использует Composition
API для управления событиями. Пример использования с
ref:
<template>
<div ref="dropdown" v-click-outside="closeDropdown">
<v-menu v-model="isOpen">
<template #activator="{ props }">
<v-btn v-bind="props">Меню</v-btn>
</template>
</v-menu>
</div>
</template>
<script>
import { ref } from 'vue';
export default {
setup() {
const isOpen = ref(false);
const dropdown = ref(null);
const closeDropdown = () => {
isOpen.value = false;
}
return { isOpen, dropdown, closeDropdown };
}
}
</script>
Такой подход обеспечивает более точное управление состоянием компонента и совместим с реактивной системой Vue 3.