v-model的真正形态(v-model只是语法糖)
<input type="text" :value="message" @input="message = $event.target.value">
默认情况下,一个组件上的 v-model 会把 value 用作 prop 且把 input 用作 event。所以当我们在一个自定义组件上使用v-model并不能实现双向绑定,因为自定的组件并没有默认的value和input事件,在使用时,我们需要按照上面那样显式的去声明定义这些东西。这时,model选项就派上用场了,在定义组件的时候,指定prop的值和监听的事件。
Vue.component('my-input',{
// 通过model指定自定义事件的,双向绑定事件和值
model: {
// 与下面props中的变量对应
prop: 'uname',
// 随便命名事件,对应下面$emit即可
event: 'changeXXX'
},
props: {
uname: {
type: String,
default: 'tom'
}
},
methods: {
updateVal(val){
this.$emit('changeXXX',val)
}
}
})
<template>
<input type="text" :value="uname" @input="updateVal($event.target.value)">
</template>
父组件内使用时,使用v-model就可以啦
// name是父组件中的属性
<my-input v-model="name" value="some value"></my-input>
<p>{{name}}</p>
等价于
<my-input :uname='name' @changeXXX='val => {foo = val}' value='some value'></my-input>