在 Vue.js 中,一个组件上的 v-model 默认会利用名为 value 的 prop 和名为 input 的事件。但是像单选框、复选框等类型的输入控件可能会将 value 属性用于不同的目的。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 的 property 将会被更新。
注意:注意你仍然需要在组件的 props 选项里声明 checked 这个 prop。
<html>
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Vue</title>
<!-- 使用 CDN 引入 Vue 库 -->
<!-- <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script> -->
<script src="https://cdn.bootcdn.net/ajax/libs/vue/2.7.9/vue.js"></script>
</head>
<body>
<div id="app">
<h1>lovingVue = {{ lovingVue }}</h1>
<base-checkbox v-model="lovingVue"></base-checkbox>
</div>
<script type="text/javascript">
Vue.component('base-checkbox', {
// 定义 v-model 默认的属性名和事件
model: {
prop: 'checked',
event: 'change'
},
props: {
// 1.父组件传值给子组件
// 将 lovingVue 的值传递给该 checked
checked: Boolean
},
// 2.子组件将值传递给父组件
// 通过 v-bind:checked 将 checked Prop 绑定到 checked 属性
// 通过 v-on:change 将当前复选框的 checked 传递给父组件
template: `
<label>
<input type="checkbox"
v-bind:checked="checked"
v-on:change="$emit('change', $event.target.checked)" /> 复选框
</label>
`
});
var app = new Vue({
el: "#app",
data: {
lovingVue: null
}
});
</script>
</body>
</html>运行效果如下图:
