v-model
是 Vue.js 中的一个指令,用于在表单控件或组件上创建双向数据绑定。它可以自动监听用户输入事件并同步更新数据,也可以监听数据变化并更新表单控件的值。常用于 <input>
、<textarea>
、<select>
等表单元素上,也可以用在自定义组件上。
说人话就是实现对于组件的数据绑定,你变我也变。
v-model的双向数据绑定的本质是做了两件事,首先绑定数据v-bind,然后绑定更新事件。
那比如说这个代码
我就可以改成:
<input v-model="message"> 等价于=>
<input :value="message" @input="message = $event.target.value">
这是对于原生元素的用法,那对于我们自己的自建组件呢?
<hy-input v-model="message"></hy-input>
//等价于
//首先相当于帮你绑定了一个modelValue的属性,默认为modelValue,也可以改为其他的
//绑定了一个事件 名称为固定的update:model-value
//自建组件传过来的就是实际的值 而input传过来的是元素,所以才有$event.target.value
//取值的过程
<hy-input :modelValue="message" @update:model-value="message = $event">
</hy-input>
那么在自定义组件中,就要定义该有的属性和方法
//hy组件
<template>
<div>
</div>
</template>
<script>
export default {
props: {
modelValue: String,
},
emits: ["update:modelValue", "update:title"],
computed: {
value: {
set(value) {
this.$emit("update:modelValue", value);
},
get() {
return this.modelValue;
}
},
why: {
set(why) {
this.$emit("update:title", why);
},
get() {
return this.title;
}
}
}
}
</script>
假设现在有这样一个需求,就是子组件中有多个input,需要在父组件中指定每一个input绑定的value如何实现
对于自建组件可以看到默认是绑定了一个:modelValue和@update方法
这段代码中,有两个计算属性 value
和 why
。value
属性有一个 setter 和一个 getter 方法。setter 方法会触发一个名为 update:modelValue
的事件,并将新的值作为参数传递给父组件。why
属性的作用方式与 value
相同,但触发的事件名称为 update:title
。这些计算属性用于在组件和其父组件之间创建双向数据绑定。当父组件更新 modelValue
或 title
属性时,子组件将自动反映这些更改。
在上述代码中,value
属性和 why
属性都有一个 getter 方法,分别用于获取 modelValue
和 title
的值。这些 getter 方法会在计算属性被访问时自动调用,因此不需要调用它们来获取值。相反,它们会自动返回 modelValue
和 title
的当前值。这些计算属性用于在组件和其父组件之间创建双向数据绑定。当父组件更新 modelValue
或 title
属性时,子组件将自动反映这些更改。