Vue提供了 v-model
指令,用于在表单类元素上双向绑定数据。
一,基本用法
v-mode
负责监听用户的输入事件以更新数据,并对一些极端场景进行一些特殊处理。
v-model
会忽略所有表单元素的 value、checked、selected attribute 的初始值而总是将Vue实例的数据作为数据来源,也就是说,使用v-mode
后,控件的值只依赖于绑定的数据。
v-model
在内部为不同的输入元素使用不同的property并抛出不同的事件:
- text 和 textarea:
value
property 和input
事件。 - checkbox 和 radio:
checked
property 和change
事件。 - select:
value
property 和change
事件。
1,文本
<div id="example">
<label>
<input v-model="message" placeholder="edit me">
</label>
<p>Message is: {{ message }}</p>
</div>
<script src="vue.js" type="text/javascript" charset="UTF-8"></script>
<script>
var example1 = new Vue({
el: '#example',
data: {
message: ''
}
})
</script>
2,多行文本
<div id="example">
<label>
<textarea v-model="message" placeholder="add multiple lines"></textarea>
</label>
<br>
<span>Multiline message is:</span>
<p style="white-space: pre-line;">{{ message }}</p>
</div>
<script src="vue.js" type="text/javascript" charset="UTF-8"></script>
<script>
var example1 = new Vue({
el: '#example',
data: {
message: ''
}
})
</script>
需要注意的是,在使用v-model绑定数据后,就收数字或英文单词输入时会实时的显示出来,但在就收中文输入时只会在选定内容后才选定,如果需要实时显示,需使用@input
代替v-model
:
<div id="example">
<label>
<input type="text" @input="handleInput" placeholder="edit me here">
</label>
<br>
<span>message is:</span>
<p style="white-space: pre-line;">{{ message }}</p>
</div>
<script src="vue.js" type="text/javascript" charset="UTF-8"></script>
<script>
var example1 = new Vue({
el: '#example',
data: {
message: ''
},
methods: {
handleInput: function (e){
this.message = e.target.value;
}
}
})
</script>
3,单选按钮
<div id="example">
<input type="radio" id="one" value="One" v-model="picked">
<label for="one">One</label>
<br>
<input type="radio" id="two" value="Two" v-model="picked">
<label for="two">Two</label>
<br>
<span>Picked: {{ picked }}</span>
</div>
<script src="vue.js" type="text/javascript" charset="UTF-8"></script>
<script>
var vm = new Vue({
el: '#example',
data: {
picked: ''
}
})
</script>
4,复选框
<div id="example">
<label>
<input type="checkbox" @click="pick">
</label>
<label>同意服务协议</label>
<br>
<p v-if="picked === true">已同意!</p>
</div>
<script src="vue.js" type="text/javascript" charset="UTF-8"></script>
<script>
var example1 = new Vue({
el: '#example',
data: {
picked: false
},
methods: {
pick: function () {
this.picked = this.picked !== true;
}
}
})
</script>
- 这里通过绑定点击事件实现状态切换。
<div id="example">
<input type="checkbox" id="checkbox" v-model="checked">
<label for="checkbox">测试{{ checked }}</label>
</div>
<script src="vue.js" type="text/javascript" charset="UTF-8"></script>
<script>
var vm = new Vue({
el: '#example',
data: {
checked: false
}
})
</script>
- 在勾选时,数据checked的值变为true。
<div id="example-3">
<input type="checkbox" id="jack" value="Jack" v-model="checkedNames">
<label for="jack">Jack</label>
<input type="checkbox" id="john" value="John" v-model="checkedNames">
<label for="john">John</label>
<input type="checkbox" id="mike" value="Mike" v-model="checkedNames">
<label for="mike">Mike</label>
<br>
<span>Checked names: {{ checkedNames }}</span>
</div>
<script src="vue.js" type="text/javascript" charset="UTF-8"></script>
<script>
new Vue({
el: '#example-3',
data: {
checkedNames: ['Jack']
}
})
</script>
- Jack是默认选项,因为这种绑定是双向的。
5,下拉列表
<div id="example">
<label>
<select v-model="selected">
<option disabled value="">请选择</option>
<option>A</option>
<option value="b">B</option>
<option>C</option>
</select>
</label>
<br>
<span>Selected: {{ selected }}</span>
</div>
<script src="vue.js" type="text/javascript" charset="UTF-8"></script>
<script>
var vm = new Vue({
el: '#example',
data: {
selected: 'C'
}
})
</script>
<option>
是备选项目,如果含有value属性,v-model会优先匹配value的值。如果没有,就会直接匹配<option>的text。- 这里默认选中C。如果v-model表达式的初始值未能匹配任何选项,
<select>
元素将被渲染为“未选中”状态。
<div id="example">
<select v-model="selected" multiple style="width: 50px;">
<option>A</option>
<option>B</option>
<option>C</option>
<option>D</option>
<option>E</option>
<option>F</option>
</select>
<br>
<span>Selected: {{ selected }}</span>
</div>
<script src="vue.js" type="text/javascript" charset="UTF-8"></script>
<script>
var vm = new Vue({
el: '#example',
data: {
selected: []
}
})
</script>
- 给
<selected>
添加属性multiple
就可以多选。 - 与复选框一样,数据绑定到同一个数组。
6,动态渲染
在业务中,<option>
经常用v-for
动态输出,value和text也是用v-bind来动态输出的。
<div id="example">
<select v-model="selected">
<option v-for="option in options" v-bind:value="option.value">
{{ option.text }}
</option>
</select>
<span>Selected: {{ selected }}</span>
</div>
<script src="vue.js" type="text/javascript" charset="UTF-8"></script>
<script>
new Vue({
el: '#example',
data: {
selected: 'A',
options: [{
text: 'One',
value: 'A'
},
{
text: 'Two',
value: 'B'
},
{
text: 'Three',
value: 'C'
}
]
}
})
</script>
二,值绑定
对于单选按钮,复选框及选择框的选项,v-model 绑定的值通常是静态字符串 (对于复选框也可以是布尔值):
<!-- 当选中时,`picked` 为字符串 "a" -->
<input type="radio" v-model="picked" value="a">
<!-- `toggle` 为 true 或 false -->
<input type="checkbox" v-model="toggle">
<!-- 当选中第一个选项时,`selected` 为字符串 "abc" -->
<select v-model="selected">
<option value="abc">ABC</option>
</select>
但在业务中,有时需要绑定一个动态的数据 , 这时可以用 v-bind
来实现。
1,单选框:
<div id="example">
<label>
<input type="radio" v-model="pick" v-bind:value="value">
</label>
<p v-if="pick === false">pick: {{pick}}</p>
<p>value: {{value}}</p>
<p v-if="pick === value">app.pick ==app.value</p>
</div>
<script src="vue.js" type="text/javascript" charset="UTF-8"></script>
<script>
var app = new Vue({
el: '#example',
data: {
pick: false,
value: true
}
})
console.log(app.pick)
</script>
- 当选中时,app.pick === app.a
2,复选框:
<div id="example">
<p>status1:{{status1}}</p>
<p>status2:{{status2}}</p>
<label>
<input
type="checkbox"
v-model="toggle"
true-value="status1"
false-value="status2"
>
click to change status!
</label>
<p>current status:{{toggle}}</p>
</div>
<script src="vue.js" type="text/javascript" charset="UTF-8"></script>
<script>
var app = new Vue({
el: '#example',
data: {
toggle: false,
status1: 'on',
status2: 'off'
}
})
</script>
- 当选中时app.toggle == ‘on’,当没有选中时vm.toggle == ‘off’
3,下拉列表:
前面的“动态渲染”就是一个例子。
- 当选中时typeof app.selected是object对象
三,修饰符
与事件的修饰符类似, v-model 也有修饰符,用于控制数据同步的时机。
1,.lazy
<!-- 在“change”时而非“input”时更新 -->
<input v-model.lazy="msg">
2,.number
<!-- 将就收到的string类型的数字转为number类型 -->
<input v-model.number="age" type="number">
3,.trim
<div id="example">
<label>
<!-- 自动过滤用户输入的首尾空白字符 -->
<input v-model.trim="msg">
</label>
<p>message:{{msg}}</p>
<p>message length:{{msg.length}}</p>
</div>
<script src="vue.js" type="text/javascript" charset="UTF-8"></script>
<script>
var app = new Vue({
el: '#example',
data: {
msg: '',
}
})
</script>
到此为止,最最基础的Vue知识算是介绍完了。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/98107.html