v-model在vue2和vue3的区别及原理

194 阅读2分钟

在vue2中

给组件使用v-model的原理是

父组件 在组件身上绑定value属性即:value="xxx" 和监听子组件发来的input事件即@input="函数名"函数中的形参接收的就是子组件传过来的新值

子组件 使用props接收value属性 在methods函数中使用emit发送input事件即this.emit发送input事件 即this.emit('input', '新的值')

满足以上条件就可以简化成v-model了

.sync修饰符

如果子组件接收的值不叫value,叫做uname(随便起的)函数中$emit发送的事件也不是input 而是change(随便起的)事件。这时 在父组件中绑定的属性就应该是:uname="xxx"监听的事件就是@change="函数名" 也可以完成双向绑定 。但是这时为了方便,把change事件修改为update:xxx就可以使用.sync的写法

在vue3中

给组件使用v-model的原理是

父组件 在组件身上绑定:modelValue="xxx"属性,和监听@update:modelValue="xxx = $event"事件

必须是:modelValue 和@update:modelValue

子组件 通过defineProps来接收数据 通过defineEmits来约定数据的类型

defineProps<{
    modelValue: string
}>()
defineEmits<{
    (e: 'update:modelValue', value: string)
}>()

第一个参数e代表事件的名称 必须叫做update:modelValue 第二个参数代表要传递的值

满足以上条件就可以简化成v-model了 <Button :modelValue="uname" @update:modelValue="uname = $event">

v-model的参数

如果想自定义的绑定属性,就可以把modelValue换成别的名字,例如age 。子组件发送的事件名为update:age事件

这时就可以在组件上使用v-model:age实现双向绑定

区别总结

在vue2中.sync和v-model的区别

首先v-model必须保证传递的属性是value 抛出的事件是input,而.sync则是满足属性名是随意的,事件必须是update:属性名

在vue3中.sync和v-model的区别

vue3中没有.sync了 而是把.sync的功能归结到了v-model里

如果传递的属性是modelValue抛出的事件是update:modelValue那么就可以使用v-model="属性"实现双绑

如果传递的属性不是modelValue 而是其他的属性名 而抛出的事件是update:属性名那么就可以使用v-model:属性名="属性"

vue3的v-model="xxx"可以绑定多个 而vue2的.sync只能绑定一个