v-model
可以实现双向绑定:
<input v-model='text'>
实际上它是一个语法糖,等价于:
<input :value="text" @input="text = $event.target.value">
也可以用在组件上,当用在组件上时,相当于:
<Comp :value="text" @input="text = val">
为了让它正常工作,这个组件内的input
必须:
1 将其value
特性绑定到一个名叫value
的prop上
2 在其input
事件被触发时,将新的值通过自定义的input
事件抛出
Vue.component('comp', {
props: ['value'],
template: `
<input
v-bind:value="value"
v-on:input="$emit('input', $event.target.value)"
>
`
})
这样就实现了组件内外的数据的双向绑定。
这个组件的v-model
默认会利用名为value
的prop和名为input
的事件,但是像单选框、复选框等类型的输入控件可能不需要value
,需要的是checked
,不需要oninput
事件,需要的是onchange
事件。model
选项可以避免这样的冲突:
Vue.component('base-checkbox', {
model: {
prop: 'checked',
event: 'change'
},
props: {
checked: Boolean
},
template: `
<input
type="checkbox"
v-bind:checked="checked"
v-on:change="$emit('change', $event.target.checked)"
>
`
})
现在在这个组件上使用v-model
的时候:
<base-checkbox v-model="lovingVue"></base-checkbox>
这里的lovingVue
的值将会传入这个名为checked
的prop。同时当<base-checkbox>
触发一个change
事件并附带一个新的值的时候,这个lovingVue
的属性将会被更新。
注意你仍然需要在组件的props
选项里声明checked
这个prop。