v-model
в Vue — это синтаксический сахар для:
value
/modelValue
(props)input
/update:modelValue
(events)<input v-model="searchText">
Эквивалентно:
<input
:value="searchText"
@input="searchText = $event.target.value"
>
<template>
<input
:value="modelValue"
@input="$emit('update:modelValue', $event.target.value)"
>
</template>
<script>
export default {
props: ['modelValue'],
emits: ['update:modelValue']
}
</script>
Использование:
<custom-input v-model="userInput" />
<template>
<input
:value="props.modelValue"
@input="emit('update:modelValue', $event.target.value)"
>
</template>
<script setup>
const props = defineProps(['modelValue'])
const emit = defineEmits(['update:modelValue'])
</script>
Компонент:
<template>
<input
:value="firstName"
@input="$emit('update:firstName', $event.target.value)"
>
<input
:value="lastName"
@input="$emit('update:lastName', $event.target.value)"
>
</template>
<script>
export default {
props: ['firstName', 'lastName'],
emits: ['update:firstName', 'update:lastName']
}
</script>
Использование:
<user-name-input
v-model:firstName="first"
v-model:lastName="last"
/>
Компонент с обработкой модификаторов:
<template>
<input
:value="modelValue"
@input="updateValue($event.target.value)"
>
</template>
<script>
export default {
props: {
modelValue: String,
modelModifiers: {
default: () => ({})
}
},
emits: ['update:modelValue'],
methods: {
updateValue(value) {
let processedValue = value
if (this.modelModifiers.capitalize) {
processedValue = value.charAt(0).toUpperCase() + value.slice(1)
}
this.$emit('update:modelValue', processedValue)
}
}
}
</script>
Использование:
<custom-input v-model.capitalize="text" />
Пример с VeeValidate:
<template>
<Field
:value="modelValue"
@input="handleInput"
v-bind="$attrs"
/>
</template>
<script>
export default {
props: ['modelValue'],
emits: ['update:modelValue'],
methods: {
handleInput(value) {
this.$emit('update:modelValue', value)
}
}
}
</script>
<input
type="checkbox"
:checked="modelValue"
@change="$emit('update:modelValue', $event.target.checked)"
>
<select
:value="modelValue"
@change="$emit('update:modelValue', $event.target.value)"
>
<option v-for="option in options" :value="option.value">
{{ option.text }}
</option>
</select>
props
и emits
явноmodelValue
как стандартное имя prop (Vue 3)Реализация v-model в кастомных компонентах требует правильной настройки props (для получения значения) и emits (для обновления значения). Vue предоставляет гибкие возможности для создания компонентов ввода с поддержкой стандартного синтаксиса v-model, включая модификаторы и множественные модели.