Двухсторонняя привязка данных — это фундаментальная концепция Vue.js, позволяющая синхронизировать данные между компонентами и элементами формы. Vue предоставляет несколько способов реализации этой функциональности.
Синтаксический сахар для двустороннего связывания данных с элементами формы:
<template>
<input v-model="message" placeholder="Редактируйте меня">
<p>Введённое сообщение: {{ message }}</p>
</template>
<script>
export default {
data() {
return {
message: ''
}
}
}
</script>
message
message
обновляется значение поля вводаДиректива v-model
— это синтаксический сахар для:
:value
)@input
)Эквивалентная реализация без v-model:
<input
:value="message"
@input="message = $event.target.value"
>
Для кастомных компонентов нужно реализовать интерфейс v-model:
<CustomInput v-model="searchText" />
Реализация в компоненте:
<template>
<input
:value="modelValue"
@input="$emit('update:modelValue', $event.target.value)"
>
</template>
<script>
export default {
props: ['modelValue'],
emits: ['update:modelValue']
}
</script>
<CustomInput v-model="searchText" />
Реализация компонента:
<template>
<input
:value="value"
@input="$emit('input', $event.target.value)"
>
</template>
<script>
export default {
props: ['value']
}
</script>
Vue предоставляет встроенные модификаторы:
.lazy
- обновляет данные по событию change
вместо input
.number
- автоматически преобразует ввод в число.trim
- удаляет пробелы с обоих концовПример:
<input v-model.lazy.trim="username">
Можно создавать собственные модификаторы через объект model
:
export default {
model: {
prop: 'checked',
event: 'change',
modifier: (value) => value.toUpperCase() // Кастомный модификатор
}
}
<UserName
v-model:first-name="first"
v-model:last-name="last"
/>
computed: {
fullName: {
get() {
return `${this.firstName} ${this.lastName}`;
},
set(value) {
const names = value.split(' ');
this.firstName = names[0];
this.lastName = names[1] || '';
}
}
}
.sync
(Vue 2) или v-model:propName
(Vue 3)ref
Vue.js предоставляет гибкие механизмы двухсторонней привязки через директиву v-model
, которая может быть адаптирована как для нативных элементов, так и для кастомных компонентов. Понимание внутренней работы этой директивы позволяет создавать мощные и поддерживаемые формы с минимальными усилиями.