Як працює директива v-model?
Директива v-model - це механізм двосторонньої прив'язки даних, який зв'язує значення елемента вводу (input, textarea, select, компонент) зі змінною у стані Vue.
Простіше кажучи:
v-modelзв'язує дані та UI так, що зміна одного автоматично оновлює інше.
Як працює v-model під капотом?
Коли ти пишеш:
<input v-model="message">Vue перетворює це на дві дії:
1. Прив'язка значення (model → view)
:value="message"UI завжди показує актуальні дані.
2. Обробник події (view → model)
@input="message = $event.target.value"Коли користувач вводить текст → змінна message оновлюється.
Саме об'єднання цих двох напрямків дає двосторонню прив'язку.
Приклад
<template>
<input v-model="name" />
<p>{{ name }}</p>
</template>
<script>
export default {
data() {
return { name: '' }
}
}
</script>Користувач вводить текст → name змінюється.
name змінюється в коді → input оновлюється.
Як v-model працює в різних елементах форми?
text input
<input v-model="text">checkbox
<input type="checkbox" v-model="checked">radio
<input type="radio" value="A" v-model="choice">
<input type="radio" value="B" v-model="choice">select
<select v-model="selected">
<option value="1">One</option>
</select>checkbox з масивами
<input type="checkbox" value="A" v-model="items">Якщо вибрано → додасться в масив. Якщо знято → видалиться.
Модифікатори v-model (Vue 3)
| Модифікатор | Що робить |
|---|---|
.lazy | оновлює модель при change, а не input |
.trim | видаляє пробіли по краях |
.number | приводить значення до числа |
Приклад:
<input v-model.trim.number="age">Як v-model працює в компонентах (Vue 3)
Коли ти пишеш:
<MyInput v-model="value" />Vue замінює це на:
- передати проп
modelValue - слухати подію
update:modelValue
Компонент має виглядати так:
<script>
export default {
props: ['modelValue'],
emits: ['update:modelValue']
}
</script>
<template>
<input
:value="modelValue"
@input="$emit('update:modelValue', $event.target.value)"
/>
</template>Це і є внутрішній механізм v-model.
Іменовані моделі (Vue 3)
Можна мати кілька v-model:
<DateRange
v-model:start="startDate"
v-model:end="endDate"
/>Компонент має підтримувати:
- проп:
start - подію:
update:start - проп:
end - подію:
update:end
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.