v-on (скорочено @) підписує обробник на подію DOM чи компонента:
<button @click="count++">+1</button> <!-- вираз -->
<button @click="save">Зберегти</button> <!-- метод: отримає об'єкт події -->
<button @click="remove(item.id)">Видалити</button> <!-- виклик з аргументами -->
<button @click="remove(item.id, $event)">...</button><!-- $event - сама подія -->
Модифікатори подій замість ручного event.preventDefault():
| Модифікатор | Що робить |
|---|---|
.prevent |
preventDefault() - форма не перезавантажує сторінку |
.stop |
stopPropagation() |
.self |
лише якщо подія виникла на самому елементі |
.once |
спрацювати один раз |
.capture |
слухати у фазі перехоплення |
.passive |
пасивний слухач (прокрутка без затримок) |
<form @submit.prevent="submit">...</form>
<div class="overlay" @click.self="close">...</div>
Модифікатори клавіш і миші:
<input @keyup.enter="search">
<input @keydown.esc="clear">
<textarea @keydown.ctrl.enter="send"></textarea>
<button @click.right.prevent="openMenu">...</button>
<input @keyup.enter.exact="send"> <!-- лише Enter, без Shift/Ctrl -->
Доступні .enter, .tab, .delete, .esc, .space, .up, .down, .left, .right, системні .ctrl, .alt, .shift, .meta, а також будь-яка назва клавіші з event.key у kebab-case (.page-down).
Порядок модифікаторів має значення: @click.prevent.self скасовує дію для кліків на будь-якому дочірньому елементі, а @click.self.prevent - лише на самому елементі.
Події компонентів слухаються так само: @save="onSave". Модифікатори на кшталт .prevent до них не застосовуються - це не DOM-події.
Пастки:
.passiveразом з.prevent- конфлікт: пасивний слухач не може скасувати дію, браузер проігнорує.preventі виведе попередження;- важкі обробники на
scroll,input,mousemove- потрібне обмеження частоти (debounce/throttle), Vue сам цього не робить; - обробники на
window/documentу шаблоні не повісиш - їх додають вonMountedі знімають вonUnmounted(абоuseEventListenerз VueUse).