Согласно статье под названием «Глубокое понимание использования формы v-model«В основном, у вас есть глубокое понимание v-model, давайте посмотрим, как его можно использовать в пользовательских компонентах.
в vue3
при использовании в пользовательских компонентахv-model
, компонент получает свойствоmodelValue
значение, затем с помощью запускаupdate:modelValue
событие для обновления значения:
<custom-comp v-model="msg"></custom-comp>
<!-- 等价于 -->
<custom-comp :model-value="msg" @update:model-value="msg = $event"></custom-comp>
<!-- 建议命名按照kebab-cased规范,如:model-value,而不是modelValue -->
реализация v-модели
В соответствии с приведенными выше правилами определения мы можем реализовать пользовательский компонент ввода следующим образом:
// 示例1:自定义input组件
// 实现1:
app.component('custom-input', {
props: ['modelValue'],
template: `
<input
:value="modelValue"
@input="$emit('update:modelValue', $event.target.value)"
>
`,
});
// 实现2:使用input的v-model + computed(计算属性)
app.component('custom-input', {
props: ['modelValue'],
computed: {
value: {
get() {
return this.modelValue;
},
set(v) {
this.$emit('update:modelValue', v);
},
},
},
template: `
<input v-model="value">
`,
});
использовать:
<custom-input v-model="msg"></custom-input>;
Приведенный выше пример - это только упаковка для ввода. Если вы не содержали ввод внутри пользовательского компонента? Для того, чтобы углубить понимание, давайте посмотрим на пользовательский компонент подсчета:
// 示例2:自定义count组件
app.component('custom-count', {
props: {
modelValue: Number,
},
methods: {
increment() {
this.$emit('update:modelValue', ++this.modelValue);
},
decrement() {
this.$emit('update:modelValue', --this.modelValue);
},
},
template: `
<button @click="increment">+1</button> ~
<button @click="decrement">-1</button>
<p>{{modelValue}}</p>
`,
});
использовать:
<custom-count v-model="num"></custom-count>;
Давайте посмотримдобиться эффекта:
параметр v-модели
В примере мы обнаруживаем, что v-model является принимающим свойством.modelValue
Значение, то срабатывание событияupdate:modelValue
чтобы обновить значение, можем ли мы изменить имя атрибутаmodelValue
Шерстяная ткань? Как это сделать? На самом деле, нам нужно только датьv-model
Вы можете добавлять параметры, такие как:v-model:mv
Так будетmodelValue
заменяетсяmv
.
app.component('custom-input', {
props: ['mv'],
template: `
<input
:value="mv"
@input="$emit('update:mv', $event.target.value)"
>
`,
});
<custom-input v-model:mv="msg"></custom-input>;
Несколько привязок v-модели
Именно из-за нового параметра v-model, передаваемого в vue3, пользовательские компоненты могут поддерживать как多个v-model
Привязки:
<user-name v-model:first-name="firstName" v-model:last-name="lastName"></user-name>
Реализация компонента становится:
app.component('user-name', {
props: {
firstName: String,
lastName: String,
},
template: `
<input
type="text"
:value="firstName"
@input="$emit('update:firstName', $event.target.value)">
<input
type="text"
:value="lastName"
@input="$emit('update:lastName', $event.target.value)">
`,
});
в vue2
при использовании в пользовательских компонентахv-model
, компонент получает свойствоvalue
значение, затем с помощью запускаinput
событие для обновления значения, которое реализуетv-model
:
<custom-comp v-model="msg"></custom-comp>
<!-- 等价于 -->
<custom-comp :value="msg" @input="msg = $event"></custom-comp>
реализация v-модели
Реализация аналогична, давайте посмотрим на реализацию пользовательского компонента ввода в vue2:
// 示例1:自定义input组件
Vue.component('comp-input', {
props: {
value: String,
},
template: `
<input
type="text"
:value="value"
@input="$emit('input', $event.target.value)"
>
`,
});
Пользовательский атрибут V-модели
Он также поддерживается в VUE2 для изменения имени принятого атрибута, но в отличие от Vue3, Vue2 - указание атрибутов в компонентахmodel
изprop
а такжеevent
модифицировать:
// 示例2:自定义count组件
Vue.component('custom-count', {
model: {
prop: 'v', // default: value
event: 'i', // default: input
},
props: {
v: Number,
},
data() {
return {
count: this.v,
};
},
template: `<button @click="$emit('i', ++count)">+1</button>`,
});
Мы видим, что в этом примере есть еще одинmodel属性
и задает два свойства:prop
а такжеevent
Да-да, это обязательные атрибуты v-модели и имя события, но их значение по умолчаниюvalue
а такжеinput
Мы реализуем настройку, изменяя опоры и событие модели модели.
Зачем выходить на образцовую собственность,официальная документацияТакже указано, что это позволяет избежать конфликтов с v-моделью, когда она имеет другое использование со значением значения, например, переключатели и флажки.Подробности см. на официальном сайте.Пример.
Суммировать
Мы объяснили v-модель пользовательских компонентов через реализацию в vue3 и vue2, и мы также можем найти различия:
- Vue3 Имя свойства по умолчанию, имя события:
modelValue
а такжеupdate:modelValue
; а в vue2 это:value
а такжеinput
; - В vue3 напрямую передайте параметры за v-model
v-model:foo
чтобы указать имя свойства, и изменение отражается в родительском компоненте, и支持绑定多个 v-model
; Vue2 через подсменовmodel 属性中的prop值和event值
Чтобы указать имена атрибутов и имена событий, измените его в подкомпонентах.
Давайте посмотрим на следующий: "Углубленное понимание модификатора v-model (сравнительный анализ vue3 и vue2)".
Приветственное сообщение обсудить или добавить обмен микро письмом (cleam_lee).