v-model
是一个语法糖,最终会生成一个属性和一个事件。并且即可以作用于表单元素,又可作用于自定义组件。
vue
会根据作用的表单元素类型,而生成合适的属性和事件。
例如,作用于普通文本框时,它会生成value
属性和input
事件;而作用于单选框或多选框时,它会生成checked
属性和change
事件。参考
v-model
也可作用于自定义组件,默认情况下,它会生成一个value
属性和input
事件。
<Children v-model="age" />
<!-- 等效于 -->
<Children :value="age" @input="age=$event" />
可通过组件的model
配置项,来改变生成的属性和事件。
// Children
export default {
model: {
prop: "address", // 默认为 value
event: "change", // 默认为 input
},
};
<template>
<div>
<input type="text" v-model="name" />
</div>
</template>
<script>
export default {
data() {
return {
name: "下雪天的夏风",
};
},
mounted() {
console.log(this._vnode);
},
};
</script>
编译结果,属性在 data.domProps
中,事件在 data.on
中。
<template>
<div>
<Children v-model="age" />
</div>
</template>
<script>
import Children from "./components/Children.vue";
export default {
components: {
Children,
},
data() {
return {
age: 18,
};
},
mounted() {
console.log(this._vnode);
},
};
</script>
<!-- 子组件 -->
<template>
<div>
<span>年龄{{ value }}</span>
<button @click="handleClick">年龄自增</button>
</div>
</template>
<script>
export default {
props: ["value"],
methods: {
handleClick() {
this.$emit("input", this.value + 1);
},
},
};
</script>
编译结果:属性在 componentOptions.propsData
中,事件在 componentOptions.listeners
中。
如果使用 model
配置项更改:
<!-- 子组件 -->
<template>
<div>
<span>年龄{{ address }}</span>
<button @click="handleClick">年龄自增</button>
</div>
</template>
<script>
export default {
model: {
prop: "address",
event: "change",
},
props: ["address"],
methods: {
handleClick() {
this.$emit("change", this.address + 1);
},
},
};
</script>
编译结果:
以上。