实现表单元素和数据的双向绑定
。区别于v-bind
程序员设定的变量,就是我们v-model绑定的值,普遍在vue实例的data选项中。那么用户提交的信息是什么呢?
一般情况下我们默认用户提交的信息为绑定v-mode指令的表单元素的value属性的值;当然这只是一般情况下,实际上用户提交的信息与不同表单类型有关。
接下来我们来分析不同的表单类型使用v-model指令绑定的值是否一定是表单的value值,不用表单类型value默认值又是什么。
<div id="app">
<input type="text" v-model="message" placeholder="请输入">
<p>输入的内容是:{{ message }}</p>
</div>
<script>
var app = new Vue({
el: '#app',
data: {
message: ''
}
})
</script>
结果:
此时,我们的input标签中并没有设置value值,我们在input方法中将其value值与绑定的message变量打印出来
<div id="app">
<input type="text" v-model="message" placeholder="请输入" @input="test1">
<p>输入的内容是:{{ message }}</p>
</div>
<script>
var app = new Vue({
el: '#app',
data: {
message: ''
},
methods: {
test1: function (e) {
console.log('this.message', this.message);
console.log('this.value', this.value);
}
}
})
</script>
此时,this.message == this.value;也就是说,text类型下,用户信息默认为该表单的value值,value默认值为框中内容。
v-model其实是一个语法糖,他背后的本质上是包含两个操作
所以上述代码等价于
<div id="app">
<input type="text" v-bind:value="message" v-on:input="message = $event.target.value" placeholder="请输入">
<p>输入的内容是:{{ message }}</p>
</div>
<script>
var app = new Vue({
el: '#app',
data: {
message: ''
}
})
</script>
也可以把input事件定义为一个方法去调用
<div id="app">
<input type="text" :value="message" @input="handleInput" placeholder="请输入">
<p>输入的内容是:{{ message }}</p>
</div>
<script>
var app = new Vue({
el: '#app',
data: {
message: ''
},
methods: {
handleInput: function (e) {
this.messsge = e.target.value;
}
}
})
</script>
上述,我们是在没有给input的value设置默认值的情况下得到的结论,那么,如果给input设置了value值呢
<div id="app">
<input type="text" v-model="message" placeholder="请输入" value="123" @input="test1">
<p>输入的内容是:{{ message }}</p>
</div>
<script>
var app = new Vue({
el: '#app',
data: {
message: ''
},
methods: {
test1: function (e) {
console.log('this.message', this.message);
console.log('this.value', this.value);
}
}
})
</script>
运行之后,我们发现结果跟没有设置默认值是相同的。这是因为,使用v-model后,表单控件显示的值只依赖所绑定的数据,不在关心初始时的value属性。 v-model 会忽略所有表单元素的 value、checked、selected attribute 的初始值。
同样的,对于文本域textarea的结论也是一样的:
<textarea v-model="text" placeholder="请输入">frvf</textarea>
this.text= e.target.value;
之间插入的值frvf也不会生效<input type="radio" id="male" v-model="sex" @click="test2">
<script>
var app = new Vue({
el: '#app',
data: {
sex: ''
},
methods: {
test1: function (e) {
console.log('this.sex', this.sex);
console.log('this.value', e.target.value);
}
}
})
</script>
运行结果:
this.sex: null
this.value: on
结论:
<input type="radio" id="male" value="男" v-model="sex" @click="test2">
<p>选择的性别是:{{ sex}}</p>
<script>
var app = new Vue({
el: '#app',
data: {
sex: ''
},
methods: {
test1: function (e) {
console.log('this.sex', this.sex);
console.log('this.value', e.target.value);
}
}
})
</script>
结论:
<input type="radio" id="male" :checked="sex" value="男" @change="test2">
<p>选择的性别是:{{ sex }}</p>
test2: function (e) {
this.sex = e.target.value;
}
单独使用时,用v-model绑定一个布尔值
<input type="checkbox" id="male" v-model="sex" @click="test2">
<script>
var app = new Vue({
el: '#app',
data: {
sex: false
},
methods: {
test2: function (e) {
console.log('this.sex', this.sex);
console.log('this.value', e.target.value);
}
}
})
</script>
<input type="checkbox" id="male" v-model="sex" value="hahahh" @click="test2">
<script>
var app = new Vue({
el: '#app',
data: {
sex: false
},
methods: {
test2: function (e) {
console.log('this.sex', this.sex);
console.log('this.value', e.target.value);
}
}
})
</script>
<input type="checkbox" id="male" v-model="sex" value="hahahh" @click="test2">
<script>
var app = new Vue({
el: '#app',
data: {
sex: []
},
methods: {
test2: function (e) {
console.log('this.sex', this.sex);
console.log('this.value', e.target.value);
}
}
})
</script>
<input type="checkbox" id="male" :checked="sex" value="hahahh" @change="test2">
<p>选择的性别是:{{ sex }}</p>
test2: function (e) {
this.sex = e.target.value;
}
综上:
v-model的作用为将程序员设定的变量与用户信息绑定,但用户信息不一定与value值绑定
v-model 在内部为不同的输入元素使用不同的 property 并抛出不同的事件:
v-model原理