可以在表单元素上创建双向数据绑定。即数据更新元素更新、元素更新数据也会更新。

本质上v-model为语法糖

元素类型 属性 事件
input[type=text]、textarea value input
input[checkbox]、input[radio] checked change
select value change

input

type=text 文本框

  1. <div id="app">
  2. <input v-model="message">
  3. <p>Message 为: {{ message }}</p>
  4. </div>
  1. const vm = new Vue({
  2. el: '#app',
  3. data:; {
  4. message: ''
  5. }
  6. })

type=checkbox 复选框

单个复选框

绑定到布尔值,v-model=”Boolean”

  1. <div id="app">
  2. <input
  3. type="checkbox"
  4. id="checkbox"
  5. v-model="checked"
  6. />
  7. <label for="checkbox">{{ checked }}</label>
  8. </div>
  1. const vm = new Vue({
  2. el: '#app',
  3. data: {
  4. checked: true
  5. }
  6. })

多个复选框

绑定到同一个数组,v-model=”Array”
数组中的值为被选中的input框value值

  1. <div id="app">
  2. <input type="checkbox" id="cheng" value="成哥" v-model="checkedNames">
  3. <label for="cheng">成哥</label>
  4. <input type="checkbox" id="deng" value="邓哥" v-model="checkedNames">
  5. <label for="deng">邓哥</label>
  6. <input type="checkbox" id="tong" value="思彤哥" v-model="checkedNames">
  7. <label for="tong">思彤哥</label>
  8. <br>
  9. <span>被选中的人有: {{ checkedNames }}</span>
  10. </div>
  1. const vm = new Vue({
  2. el: '#app',
  3. data: {
  4. checkedNames: []
  5. }
  6. })

type=radio 单选框

被绑定的数据和value同步

  1. <div id="app">
  2. <input type="radio" id="cheng" value="成哥" v-model="picked">
  3. <label for="cheng">成哥</label>
  4. <input type="radio" id="deng" value="邓哥" v-model="picked">
  5. <label for="deng">邓哥</label>
  6. <input type="radio" id="tong" value="思彤哥" v-model="picked">
  7. <label for="deng">思彤哥</label>
  8. <br>
  9. <span>被选中的人: {{ picked }}</span>
  10. </div>
  1. const vm = new Vue({
  2. el: '#app',
  3. data: {
  4. picked: ''
  5. }
  6. })

textarea

  1. <div id="app">
  2. <p >多行文本为:{{ message }}</p>
  3. <textarea v-model="message" placeholder="添加文本"></textarea>
  4. </div>
  1. const vm = new Vue({
  2. el: '#app',
  3. data: {
  4. message: ''
  5. }
  6. })

select

匹配的值为option中的汉字

单选

  1. <div id="app">
  2. <select v-model="selected">
  3. <option>A</option>
  4. <option>B</option>
  5. <option>C</option>
  6. </select>
  7. <span>Selected: {{ selected }}</span>
  8. </div>
  1. const vm = new Vue({
  2. el: '#app',
  3. data: {
  4. selected: '请选择'
  5. }
  6. })

注意:如果 v-model 表达式的初始值未能匹配任何选项,<select> 元素将被渲染为“未选中”状态。在 iOS 中,这会使用户无法选择第一个选项。因为这样的情况下,iOS 不会触发 change 事件。因此,可以提供一个值为空的禁用选项:

  1. <div id="app">
  2. <select v-model="selected">
  3. <option value="" disabled >请选择</option>
  4. <option>A</option>
  5. <option>B</option>
  6. <option>C</option>
  7. </select>
  8. <span>Selected: {{ selected }}</span>
  9. </div>

多选

绑定到一个数组

  1. <div id="app">
  2. <select v-model="selected" multiple>
  3. <option>A</option>
  4. <option>B</option>
  5. <option>C</option>
  6. </select>
  7. <span>选择: {{ selected }}</span>
  8. </div>
  1. const vm = new Vue({
  2. el: '#app',
  3. data: {
  4. selected: []
  5. }
  6. })

修饰符

.lazy

在默认情况下,v-model在每次input事件触发后将输入框的值与数据进行同步。如果要变为使用change事件同步可以添加lazy修饰符:

  1. <!-- 在“change”时而非“input”时更新 -->
  2. <input v-model.lazy="msg" >

.number

自动将用户的输入值转为数值类型:

  1. <input v-model.number="age" type="number">

.trim

自动过滤用户输入的首尾空白字符:

  1. <input v-model.trim="msg">