(1)基本用法
用 v-model
指令在表单 <input>
、<textarea>
及 <select>
元素上创建双向数据绑定。负责监听用户的输入事件以更新数据,并对一些极端场景进行一些特殊处理。
v-model
会忽略所有表单元素的 value
、checked
、selected
特性的初始值而总是将 Vue 实例的数据作为数据来源。你应该通过 JavaScript 在组件的 data
选项中声明初始值。
<input v-model="message" placeholder="edit me">
<p>Message is: {{ message }}</p>
(2)修饰符
1.
在默认情况下,v-model
在每次 input
事件触发后将输入框的值与数据进行同步。你可以添加 lazy
修饰符,从而转变为使用 change
事件进行同步:(.lazy)
<input v-model.lazy="msg" >
2. 自动将用户的输入值转为数值类型(. number )
<input v-model.number="age" type="number">
因为即使在 type="number"
时,HTML 输入元素的值也总会返回字符串。如果这个值无法被 parseFloat()
解析,则会返回原始的值。
3. 自动过滤用户输入的首尾空白字符(.trim)
<input v-model.trim="msg">
(3)自定义 v-model
v-model本质上是 :value 和 v-on 的结合体,就是绑定他的value,通过v-on触发,从而更新数据。
1.input 使用了 :value 而不是 v-model
2.change 和 model.event 中是对应的
3.props 中的 text 属性、model 中 prop 以及 :value 要对应起来
<input type="text" :value="text" @input="$emit('change', $event.target.value)">
export default {
model: {
prop: 'text', // 对于 props text
event: 'change'
},
props: {
text: String,
default() {
return ''
}
}
}
如何使用呢?
<CustomVModel v-model="name" />
(4)双向数据绑定 v-model 的实现原理
主要依赖于Object.defineProperty(),通过这个函数可以监听到get,set事件,通知订阅者,触发update方法,从而实现更新视图。
1.input 元素的 value = this.name
2.绑定 input 事件 this.name = $event.target.value
3.data 更新触发 re-render