Как в Vue обрабатывать события (например, клик)?
Во Vue обработка событий — это способ реагировать на действия пользователя, такие как клик мышью, нажатие клавиши, наведение и т.д. Vue предоставляет декларативный и удобный синтаксис для привязки слушателей событий к элементам через директиву v-on или сокращение @.
Базовая обработка клика
Событие click — одно из самых часто используемых событий в веб-разработке. Во Vue его можно обработать следующим образом:
<button v-on:click="handleClick">Нажми меня</button>
или с использованием сокращения:
<button @click="handleClick">Нажми меня</button>
Метод handleClick должен быть определён в объекте methods компонента:
export default {
methods: {
handleClick() {
console.log('Кнопка нажата');
}
}
}
Что делает Vue при @click
Когда вы используете @click="handleClick", Vue:
-
Добавляет слушатель события click на элемент.
-
Когда пользователь кликает, вызывается метод handleClick с контекстом текущего компонента.
-
Вы можете использовать this внутри метода для доступа к данным и другим методам.
Передача аргументов в обработчик
Если нужно передать параметры, используется синтаксис с функцией:
<button @click="handleClick('привет')">Передать аргумент</button>
methods: {
handleClick(message) {
console.log(message); // 'привет'
}
}
Доступ к самому событию
Событие можно передать явно, используя специальное слово $event:
<button @click="handleClick($event)">Показать событие</button>
methods: {
handleClick(event) {
console.log(event.target); // элемент DOM
}
}
Обработка событий с модификаторами
Vue предоставляет специальные модификаторы, которые позволяют изменить поведение событий.
.prevent
Вызывает event.preventDefault():
<form @submit.prevent="submitForm">Отправить</form>
Без .prevent браузер перезагрузит страницу при отправке формы.
.stop
Вызывает event.stopPropagation(), чтобы остановить всплытие события:
<div @click="outerClick">
<button @click.stop="innerClick">Нажми меня</button>
</div>
Событие не дойдёт до div, если .stop используется на кнопке.
.once
Обработчик вызовется только один раз:
<button @click.once="clickOnce">Только один раз</button>
.capture
Слушатель будет работать на фазе перехвата, а не всплытия:
<div @click.capture="onCapture">...</div>
.self
Обработчик сработает только если клик был по самому элементу, а не по его дочерним:
<div @click.self="onSelfClick">Только если клик прямо сюда</div>
Комбинирование модификаторов
Можно использовать несколько:
<button @click.stop.prevent="doSomething">Нажми</button>
Это предотвратит действие браузера и остановит всплытие.
Привязка событий к клавишам
Vue поддерживает модификаторы клавиш для обработки событий клавиатуры:
<input @keyup.enter="submitForm" />
Это означает: когда пользователь нажмёт Enter, вызовется submitForm.
Доступные клавиши:
-
.enter
-
.tab
-
.delete
-
.esc
-
.space
-
.up, .down, .left, .right
-
и другие
Пример: простой счётчик
<template>
<div>
<p>Счёт: {{ count }}</p>
<button @click="count++">+</button>
<button @click="count--">-</button>
</div>
</template>
<script>
export default {
data() {
return {
count: 0
}
}
}
</script>
Событие @click прямо увеличивает/уменьшает count.
Обработка событий в цикле
В v-for можно передавать аргумент, например индекс или объект:
<ul>
<li v-for="(item, index) in items" :key="item.id">
{{ item.name }}
<button @click="removeItem(index)">Удалить</button>
</li>
</ul>
methods: {
removeItem(index) {
this.items.splice(index, 1);
}
}
Добавление событий к компоненту
Если вы используете кастомный компонент и хотите слушать события, нужно использовать v-on или @, и убедиться, что компонент испускает (emit) нужное событие:
<CustomButton @click="doSomething" />
А внутри компонента CustomButton:
this.$emit('click')
Обработка событий на нативных HTML-элементах внутри компонентов
Если ваш компонент оборачивает нативный элемент (например, button), и вы хотите слушать его события снаружи, используйте .native:
<MyButton @click.native="handleClick" />
В Vue 3 подход изменился: теперь нужно явно проксировать события через emits.
Обработка событий мыши и клавиш с дополнительной логикой
Vue также поддерживает модификаторы для событий мыши:
<button @click.right="onRightClick">ПКМ</button>
-
.right — правая кнопка мыши
-
.middle — колесико
И комбинации клавиш:
<input @keyup.ctrl.enter="sendMessage" />
Работает как if (event.ctrlKey && event.key === 'Enter').
Обработка событий во вложенных компонентах
Компонент A вызывает событие:
this.$emit('submit')
Компонент B использует A и обрабатывает:
<ComponentA @submit="handleSubmit" />
Vue автоматически связывает событие компонента с методом родителя.
Vue позволяет обрабатывать любые нативные и пользовательские события удобно, декларативно и с минимальным количеством кода, сохраняя читаемость, контроль и производительность.