基础语法
可以用v-model指令在表单<input> <textarea> <select> 元素上创建双向数据绑定。它会根据空间类型自动选取正确的方法来更新元素,负责监听用户的输入事件以更新数据,并对一些极端场景进行一些特殊处理。
v-model会忽略所有表单元素的valuecheckedselectedattribute的初始值而总是将Vue实例的数据作为数据来源,应该通过data选项中声明初始值。
v-model在内部为不同的输入元素使用不同的property并抛出不同的事件:
- text,textarea --- value,input
- checkbox,radio --- checked,change
- select字段将value作为prop并将change作为事件
单行文本
<input v-model="message" placeholder="编辑">
<p>信息是: {{ message }}</p>
多行文本
<p style="white-space: pre-line;">{{ message }}</p>
<br>
<textarea v-model="message" placeholder="编辑多行文本"></textarea>
在文本区域插值
<textarea>{{text}}</textarea>不会生效,应用v-model来代替。
复选框
单个复选框,绑定到布尔值:
<input type="checkbox" id="checkbox" v-model="checked">
<label for="checkbox">{{ checked }}</label>
多个复选框,绑定到一个数组
单选按钮
<div id="app">
<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 }}</span>
</div>
new Vue({
el: '#app',
data: {
picked: ''
}
})
结果:
选择框
单选时:
<div id="app">
<select v-model="selected">
<option disabled value="">请选择</option>
<option>js</option>
<option>ts</option>
</select>
<span>选择:{{selected}}</span>
</div>
new Vue({
el: '#app',
data: {
selected: ''
}
})
结果:
如果v-model表达式的初始值未能匹配任何选项,
<select>元素将被渲染为“未选中”状态,在ios中,会使用户无法选择第一个选项,因此,更推荐提供一个值为空的禁用选项
多选时:
<div id="app">
<select v-model="selected" multiple>
<option disabled value="">请选择</option>
<option>1</option>
<option>2</option>
<option>3</option>
</select>
<br>
<span>选择:{{selected}}</span>
</div>
new Vue({
el: '#app',
data: {
selected: []
}
})
结果:
用v-for渲染的动态选项:
<div id="app">
<select v-model="selected">
<option v-for="option in options" v-bind:value="option.value">{{option.text}}</option>
</select>
<span>选择:{{selected}}</span>
</div>
new Vue({
el: '#app',
data: {
selected: 'A',
options: [
{ text: 'One', value: 'A' },
{ text: 'Two', value: 'B' },
{ text: 'Three', value: 'C' }
]
}
})
结果:
修饰符
.lazy
可以在change事件触发后将输入框的值与数据进行同步:
<!-- 在“change”时而非“input”时更新 -->
<input v-model.lazy="message">
.number
可以自动将用户的输入值转为数值类型:
<input v-model.number="age" type="number">
.trim
可以自动过滤用户输入首尾空白字符:
<input v-model.trim="message">