Привязка событий в Vue: v-on, @ и модификаторы

Что такое привязка событий в Vue?
Привязка событий — это механизм Vue.js, который позволяет навесить слушатель событий на элемент DOM. Когда событие происходит (например, клик или нажатие клавиши), Vue вызывает выражение или метод, связанный с этим событием.
В Vue для привязки событий используется директива v-on. Её можно читать как «подпиши на событие». Для частого использования есть синтаксический сахар — символ @, который заменяет v-on.
Короткое определение: v-on — директива Vue для привязки DOM‑событий к выражениям или методам компонента.
Базовый пример привязки события click
Пример Vue 3 с v-on, который увеличивает счётчик при клике на кнопку:
{{ counter }}
Здесь выражение counter++ привязано к событию click через v-on. Эквивалент с сокращением @ выглядит так:
Привязка других событий и модификаторов клавиш
Не только click доступен для привязки. Вы можете использовать любые DOM‑события, например mouseover, keydown и др. Vue также поддерживает модификаторы клавиш, например .enter:
В этом примере выражение выполнится только при нажатии клавиши Enter, когда элемент в фокусе.
Связывание событий с методами
В практике чаще используют методы для более сложной логики. Методы определяются в объекте methods и вызываются из обработчиков событий:
{{ counter }}
Передача аргументов в методы
Чтобы передать аргументы, вызовите метод с параметром в обработчике:
{{ counter }}
Это позволяет гибко управлять поведением компонентов через параметры.
Модификаторы событий: prevent и stop
Модификаторы событий в Vue — это короткий способ изменить поведение события без написания дополнительного кода. Модификаторы цепляются к событию через точку.
- prevent — предотвращает действие по умолчанию (event.preventDefault()). Чаще используется на формах, чтобы отменить перезагрузку страницы при submit.
- stop — останавливает всплытие события (event.stopPropagation()).
Пример prevent:
Пример stop и иллюстрация всплытия событий:
Дополнительные CSS‑стили, чтобы было проще визуально понять структуру:
Когда вы кликаете на кнопку, сработают buttonClick и innerClick, но outerClick не вызовется из‑за @click.stop на внутреннем блоке.
Частые сценарии и практические советы
- Используйте выражения для простых действий (counter++), методы — для логики средней и высокой сложности.
- Для формы чаще используйте @submit.prevent и затем вызывайте метод, который отправляет данные асинхронно.
- Если нужно отменить всплытие, используйте .stop; если нужно предотвратить дефолтное поведение — .prevent. Модификаторы можно комбинировать: @click.stop.prevent.
- Для клавиатурных сочетаний применяйте модификаторы клавиш (.enter, .esc, .left, .right и т.д.).
Отладка привязок событий — мини‑методика
- Откройте DevTools и убедитесь, что элемент присутствует в DOM.
- Проверьте консоль на ошибки Vue (например, ошибка вызова метода).
- Временно замените метод на console.log(…) чтобы убедиться, что событие срабатывает.
- Убедитесь, что элемент не перекрыт другим элементом (вопрос z-index / pointer-events).
- Если используете динамические компоненты или v-if, проверьте, что слушатель навешивается после рендера.
Когда привязка событий даёт сбои — типичные ошибки и контрпримеры
- Ошибка «this is undefined» при использовании методов: в Options API this указывает на экземпляр Vue, но в стрелочных функциях this может быть унаследован из внешней области. Решение: используйте обычные функции для методов, а не стрелочные.
- Обработчик не вызывается: элемент не в DOM или закрыт v-if; проверьте условие рендера.
- Всплытие событий вызывает нежелательные эффекты на родителях: используйте .stop или проверяйте целевой элемент через event.target.
- Выполнение дефолтных действий форм: забыли .prevent на submit.
Альтернативные подходы
- Нативный addEventListener: полезно в тех случаях, когда нужно слушать события вне Vue (например, глобальные события на window). Требует ручного отписывания в destroy/unmounted.
- Composition API + ref: в setup можно получить ссылку на элемент и навесить слушатель вручную при mount. Это даёт больше контроля, но требует больше кода.
Пример с addEventListener в setup:
import { onMounted, onBeforeUnmount, ref } from 'vue'
export default {
setup() {
const el = ref(null)
function onScroll(e) { console.log('scroll', e) }
onMounted(() => {
window.addEventListener('scroll', onScroll)
})
onBeforeUnmount(() => {
window.removeEventListener('scroll', onScroll)
})
return { el }
}
}Быстрая шпаргалка по синтаксису
- v-on:event=”handler” или @event=”handler”
- @click.prevent — отменяет default
- @click.stop — останавливает всплытие
- @keydown.enter — слушает Enter
- Передача аргументов: @click=”method(5)”
Чек‑лист для разработчика
- Используются методы для сложной логики
- Простые выражения не перегружают шаблон
- Для форм стоит использовать @submit.prevent
- При использовании addEventListener реализовано снятие слушателей
- Модификаторы применяются осознанно (.stop/.prevent)
- Не используются стрелочные функции в methods
Роли — что проверяет ревьюер кода
- Разработчик: правильность логики метода, отсутствие побочных эффектов.
- Ревьюер: нет утечек слушателей, корректная обработка ошибок, читаемость.
- QA: проверка сценариев клика, клавиатурных событий и форм.
1‑строчный глоссарий
- v-on — директива для привязки событий.
- @ — сокращение для v-on.
- prevent — модификатор для event.preventDefault().
- stop — модификатор для event.stopPropagation().
Критерии приёмки
- Все сценарии пользовательских событий работают корректно в UI.
- Нет ошибок в консоли при тестовых кликах и сабмитах.
- Никаких утечек слушателей при переключении маршрутов/компонентов.
Заключение
Привязка событий — базовая, но критичная часть интерактивных Vue‑приложений. Простые выражения подходят для мелких изменений состояния, методы — для бизнес‑логики, а модификаторы дают быстрый контроль над поведением событий. При необходимости использовать низкоуровневые слушатели — не забудьте об отписке и тестировании.
Важно: если требуется более тонкий контроль (например, делегирование событий в больших списках), рассмотрите комбинацию Vue‑шаблонов и нативных обработчиков через Composition API.
Вопросы и примеры вашего конкретного случая можно добавить в комментариях — я помогу адаптировать пример под ваш код.
Похожие материалы
Как скрыть или показать пост в Facebook для конкретных людей
Заблокировать профиль Chrome паролем
Как начать вести влог — руководство для новичков
Как зарабатывать Microsoft Rewards на Xbox
Buildbox: создать игру без кода