Обработка событий: v-on
Что такое v-on
v-on — слушает DOM-события. Клик, ввод, отправка формы, наведение.
Синтаксис
Полный:
<button v-on:click="handleClick">Клик</button>
Краткий (@):
<button @click="handleClick">Клик</button>
@ — сахар для v-on:. Используй его.
Inline vs метод
Inline:
<button @click="count++">+1</button>
<button @click="message = 'Привет'">Поздороваться</button>
Метод:
<button @click="handleClick">Клик</button>
function handleClick() {
count.value++;
}
С аргументами:
<button @click="greet('Иван')">Поздороваться</button>
С объектом события:
<button @click="handleClick($event, 'arg')">Клик</button>
Основные события
<button @click="onClick">Клик</button>
<input @input="onInput" @change="onChange" @focus="onFocus" @blur="onBlur">
<form @submit.prevent="onSubmit">
<div @mouseover="onMouseOver" @mouseleave="onMouseLeave">
<input @keydown="onKeyDown" @keyup="onKeyUp">
<div @scroll="onScroll">
<div @wheel="onWheel">
Модификаторы
.stop — остановить всплытие:
<div @click="outer">
<button @click.stop="inner">Клик</button>
</div>
.prevent — предотвратить дефолт:
<form @submit.prevent="onSubmit"></form>
<a @click.prevent href="/">Ссылка</a>
.once — один раз:
<button @click.once="handleOnce">Один раз</button>
.self — только на себя:
<div @click.self="onSelf">
<button>Клик на кнопку не сработает</button>
</div>
.capture — захват:
<div @click.capture="onCapture">Сначала сработает здесь</div>
Модификаторы клавиш
По конкретной клавише:
<input @keyup.enter="onEnter">
<input @keyup.esc="onEsc">
<input @keyup.tab="onTab">
<input @keyup.delete="onDelete">
<input @keyup.space="onSpace">
<input @keyup.up="onUp">
<input @keyup.down="onDown">
Через kebab-case:
<input @keyup.page-down="onPageDown">
Через точку с цифрой (kebab для .):
<input @keyup.a="onA">
С кастомными клавишами — Vue.config.keyCodes:
app.config.keyCodes.f1 = 112;
Комбинации:
<input @keyup.ctrl.enter="onCtrlEnter">
<input @keyup.alt.enter="onAltEnter">
Модификаторы мыши
<button @click.left="onLeft">ЛКМ</button>
<button @click.right="onRight">ПКМ</button>
<button @click.middle="onMiddle">СКМ</button>
Модификаторы системных клавиш
<input @keyup.ctrl.enter="onCtrlEnter">
<input @keyup.shift.enter="onShiftEnter">
Точная комбинация (без других модификаторов) — .exact:
<button @click.ctrl.exact="onCtrlOnly">Только Ctrl</button>
<button @click.exact="onNoModifiers">Без модификаторов</button>
Полный пример
<template>
<form @submit.prevent="submit">
<input
v-model="name"
@keyup.enter="submit"
placeholder="Имя"
>
<button type="submit" :disabled="!name">
Отправить
</button>
<button type="button" @click.once="clear">
Очистить
</button>
<div class="log">
<p v-for="(msg, i) in log" :key="i">{{ msg }}</p>
</div>
</form>
</template>
<script setup>
import { ref } from 'vue';
const name = ref('');
const log = ref([]);
function submit() {
log.value.push(`Отправлено: ${name.value}`);
name.value = '';
}
function clear() {
log.value = [];
}
</script>
Модификаторы в действии
Стоп всплытие:
<div @click="outer">
<button @click.stop="inner">Кнопка</button>
</div>
Без .stop: клик на кнопку вызывает и inner, и outer.
С .stop: только inner.
Форма:
<form @submit.prevent="onSubmit"></form>
Без .prevent: страница перезагрузится.
С .prevent: останется.
Что важно помнить
@=v-on:— используй краткий- Модификаторы цепочкой:
@click.stop.prevent .preventдля форм — обязательно.stopдля вложенных — иначе всплытие
Итог
- v-on или @ — слушает события
- Модификаторы:
.stop,.prevent,.once,.self,.capture - Клавиши:
.enter,.esc,.tabи др. - Комбинации:
.ctrl.enter
Дальше — формы и v-model.