Skip to content
Topic 3 of 5
Theory

События и v-model

События: v-on и @

Подписка на событие — директива v-on:событие, коротко @событие. Значение — имя функции или небольшое выражение:

<button @click="increment">+1</button>
<button @click="count++">+1</button>                 <!-- выражение прямо в шаблоне -->
<button @click="addItem('книга')">Добавить</button>   <!-- вызов с аргументом -->
<input @keyup.enter="search" />

В шаблоне ref распаковывается, поэтому count++ работает без .value. Если функции нужен объект события, его передают специальной переменной $event: @input="onInput($event)".

Модификаторы

После точки можно добавить модификатор — частые действия без лишнего кода:

<form @submit.prevent="save">         <!-- event.preventDefault() -->
<a @click.stop="open">                <!-- event.stopPropagation() -->
<button @click.once="start">          <!-- сработает один раз -->
<input @keyup.enter="send" />          <!-- только клавиша Enter -->
<input @keyup.esc="cancel" />

@submit.prevent — то же, что e.preventDefault() в обработчике, но короче и нагляднее.

v-model — двусторонняя связь

Связать поле ввода и данные в React нужно было вручную: value + onChange. Во Vue для этого есть v-model:

<input v-model="name" />
<p>Привет, {{ name }}!</p>

Это сокращение для :value="name" + @input="name = $event.target.value". Данные меняются, когда печатают в поле, а поле меняется, когда меняют данные из кода (name.value = "" очистит поле).

v-model для разных полей

<textarea v-model="bio"></textarea>

<input type="checkbox" v-model="agree" />              <!-- true / false -->

<input type="radio" value="card" v-model="pay" />
<input type="radio" value="cash" v-model="pay" />      <!-- pay = "card" или "cash" -->

<select v-model="city">
  <option value="dyu">Душанбе</option>
  <option value="msk">Москва</option>
</select>

Vue сам выбирает нужное свойство (value или checked) и событие (input или change).

Модификаторы v-model:

  • v-model.trim — убирает пробелы по краям;
  • v-model.number — превращает введённое в число ("42" → 42);
  • v-model.lazy — обновляет данные не на каждую букву, а когда поле покинули.

Форма целиком

const App = {
  setup() {
    const form = reactive({ name: "", email: "", subscribe: true });
    const sent = ref(false);
    const submit = () => {
      if (!form.name.trim()) return;
      console.log("Отправляем", { ...form });
      sent.value = true;
    };
    return { form, sent, submit };
  },
  template: `
    <form v-if="!sent" @submit.prevent="submit">
      <input v-model.trim="form.name" placeholder="Имя" />
      <input v-model="form.email" type="email" placeholder="Почта" />
      <label><input type="checkbox" v-model="form.subscribe" /> Подписаться</label>
      <button>Отправить</button>
    </form>
    <p v-else>Спасибо, {{ form.name }}!</p>
  `,
};

reactive удобен для форм: все поля в одном объекте, v-model="form.name" работает напрямую.

Изменение массивов

Во Vue реактивный массив можно менять методами push, unshift, splice — изменения отследятся. Можно и заменить массив целиком: items.value = items.value.filter(...). Оба способа нормальны; замена через filter удобна для удаления.

Итог

  • @событие="функция" или выражение; модификаторы .prevent, .stop, .enter, .once.
  • v-model связывает поле и данные в обе стороны; для чекбокса — true/false, для select — value опции.
  • v-model.trim, .number, .lazy — обработка ввода без лишнего кода.
  • Массивы можно менять push / unshift / splice или заменять целиком.

Эхо

Easy+10 XP

Компонент Echo: поле <input>, связанное через v-model с ref text (сначала пустая строка), и <p> под ним, где этот текст показан заглавными буквами.

ввели "hello"  →  HELLO

Connect the connector to solve tasks

Task code runs on your own computer — faster and more reliable than in the browser. This needs the free CodeWithMe connector app. You only connect it once.

Looking for the connector on this computer…

  1. 1
    Download the connector for your system (Windows, macOS or Linux).Download the connectorOn the download page pick the file with your system in its name, e.g. windows-amd64.
  2. 2Run it and choose a folder for your solutions. It will install Python and Node.js there by itself when needed.
  3. 3
    Enter below the 6-digit code shown in the connector window (“Code for CodeWithMe”). If the browser asks about local network access — allow it.

The connector is open source (on GitHub), works only on your computer and runs code only after you enter the pairing code.