Для чего используется v-model?

Директива v-model во Vue используется для создания двусторонней привязки между данными в модели компонента (data) и пользовательским интерфейсом (DOM). Это означает, что изменения, происходящие в UI (например, пользователь что-то вводит в поле), автоматически отражаются в данных, и наоборот — любые изменения в данных моментально обновляют отображение в DOM.

Основная цель v-model

v-model позволяет легко и эффективно синхронизировать данные между логикой приложения и его представлением. Он особенно полезен при работе с формами, полями ввода, селектами, чекбоксами и другими элементами взаимодействия с пользователем.

Как работает v-model

Под капотом v-model — это сочетание:

  • :value (или другого атрибута, зависящего от типа элемента),

  • и события (@input, @change, @update:modelValue и т.д.).

Пример:

<input v-model="name">

Эквивалентно:

<input :value="name" @input="name = $event.target.value">

Это означает:

  • Значение из data.name вставляется в поле input.

  • Когда пользователь вводит данные, срабатывает событие input, и значение в data.name обновляется.

Применение v-model на разных элементах

1. Текстовое поле

<input v-model="username">
data() {
return {
username: ''
}
}

Изменения в username отображаются в input, и пользовательский ввод обновляет username.

2. Многострочный текст (textarea)

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

Поддерживает те же правила: синхронизация между содержимым и данными.

3. Чекбокс (checkbox)

<input type="checkbox" v-model="isActive">
data() {
return {
isActive: false
}
}
  • При установке чекбокса значение isActive становится true.

  • При снятии — false.

Если v-model применяется к чекбоксу с массивом:

<input type="checkbox" v-model="selectedFruits" value="apple">
<input type="checkbox" v-model="selectedFruits" value="banana">
data() {
return {
selectedFruits: \[\]
}
}

Выбранные значения будут автоматически добавляться/удаляться из массива.

4. Радиокнопки (radio)

<input type="radio" v-model="picked" value="One">
<input type="radio" v-model="picked" value="Two">
data() {
return {
picked: ''
}
}

picked примет значение One или Two в зависимости от выбора пользователя.

5. Выпадающий список (select)

<select v-model="selected">
<option disabled value="">Выберите</option>
<option>Vue</option>
<option>React</option>
</select>
data() {
return {
selected: ''
}
}

6. Select с множественным выбором

<select v-model="selectedItems" multiple>
<option>HTML</option>
<option>CSS</option>
<option>JS</option>
</select>
data() {
return {
selectedItems: \[\]
}
}

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

Vue предоставляет специальные модификаторы для управления тем, как v-model обрабатывает ввод:

.lazy

Изменения происходят при change, а не input:

<input v-model.lazy="msg">

.number

Преобразует ввод в число:

<input v-model.number="age">

"42" → 42.

.trim

Удаляет пробелы в начале и конце строки:

<input v-model.trim="username">

Использование в компонентах

В Vue 2, чтобы использовать v-model с компонентом, компонент должен:

  • Принимать проп value,

  • Эмитить событие input.

Пример:

<MyInput v-model="email" />

Внутри компонента:

<input :value="value" @input="$emit('input', $event.target.value)">

В Vue 3 — используется modelValue и событие update:modelValue:

<MyInput v-model="email" />

В компоненте:

props: \['modelValue'\],
emits: \['update:modelValue'\]
<input :value="modelValue" @input="$emit('update:modelValue', $event.target.value)">

Также Vue 3 поддерживает несколько моделей:

<MyComponent
v-model:title="pageTitle"
v-model:content="pageContent"
/>

Компонент должен:

  • Принимать title, content как props,

  • Эмитить update:title, update:content.

Польза использования v-model

  • Упрощает работу с формами, снижает объём шаблонного кода.

  • Автоматически поддерживает актуальность данных.

  • Сокращает количество ручных обработчиков.

  • Обеспечивает реактивность — любые изменения немедленно отражаются в UI.

  • Повышает читаемость и поддержку кода.

  • Подходит как для стандартных HTML-элементов, так и для пользовательских компонентов.

v-model — один из ключевых инструментов Vue, обеспечивающий лаконичный, выразительный и мощный способ управления состоянием формы и взаимодействия с пользователем в приложении.