v-model 指令(表单双向绑定)

2017-12-07  本文已影响580人  microkof

v-model 只用在表单控件身上,会根据控件类型自动选取正确的方法来更新元素。

双向数据绑定

说起v-model就必须先了解双向数据绑定,然而这个概念又不是几句能说清的,这里只说实现效果是怎样的:

Vue实例的data变化,会影响表单控件的值;
反之,表单控件的值,会影响Vue实例的data。

用在输入控件上的基本用法

<div id="app">
  <p>input 元素:</p>
  <input v-model="message" placeholder="编辑我……">
  <p>消息是: {{ message }}</p>
    
  <p>textarea 元素:</p>
  <p style="white-space: pre">{{ message2 }}</p>
  <textarea v-model="message2" placeholder="多行文本输入……"></textarea>
</div>
 
<script>
new Vue({
  el: '#app',
  data: {
    message: 'Runoob',
    message2: '菜鸟教程\r\nhttp://www.runoob.com'
  }
})
</script>

用在复选框上的基本用法

data有一个布尔值子对象,将这个子对象传递给<input type="checkbox">控件。结果会改变控件的勾选状态。控件自己勾选状态的变化,又会影响布尔值。这就是基本用法。

<div id="app">
  <p>单个复选框:</p>
  <input type="checkbox" id="checkbox" v-model="checked">
  <label for="checkbox">{{ checked }}</label>
</div>
 
<script>
new Vue({
  el: '#app',
  data: {
    checked : false
  }
})
</script>

用在复选框上的进阶用法

跟基本用法不同,这次将空数组传递给控件,这时Vue会认为你希望将控件的value传递给控件,那么,如果value匹配,则勾选,不匹配的则不勾选。

如果想让某个控件默认勾选,则数组中加入该控件的value即可。比如["google"]

另外从例子中可以看到,如果你想打印数组,Vue会把数组变成字面量,然后以字符串形式打印。

<div id="app">
  <p>多个复选框:</p>
  <input type="checkbox" id="runoob" value="Runoob" v-model="checkedNames">
  <label for="runoob">Runoob</label>
  <input type="checkbox" id="google" value="Google" v-model="checkedNames">
  <label for="google">Google</label>
  <input type="checkbox" id="taobao" value="Taobao" v-model="checkedNames">
  <label for="taobao">taobao</label>
  <br>
  <span>选择的值为: {{ checkedNames }}</span>
</div>
 
<script>
new Vue({
  el: '#app',
  data: {
    checkedNames: []
  }
})
</script>

用在单选框上的用法

由于单选框只会有一个控件处于勾选状态,所以只需要传入一个字符串即可,这个字符串需要跟控件的value一致。如果传空串,则默认不勾选任何控件。

<div id="app">
  <input type="radio" id="runoob" value="Runoob" v-model="picked">
  <label for="runoob">Runoob</label>
  <br>
  <input type="radio" id="google" value="Google" v-model="picked">
  <label for="google">Google</label>
  <br>
  <span>选中值为: {{ picked }}</span>
</div>
 
<script>
new Vue({
  el: '#app',
  data: {
    picked : 'Runoob'
  }
})
</script>

用在select上的用法

select在百分之九十九的情况下是单选模式,所以传入空串或者一个字符串即可,跟单选框类似。

<div id="app">
  <select v-model="selected" name="fruit">
    <option value="">选择一个网站</option>
    <option value="www.runoob.com">Runoob</option>
    <option value="www.google.com">Google</option>
  </select>
 
  <div id="output">
      选择的网站是: {{selected}}
  </div>
</div>
 
<script>
new Vue({
  el: '#app',
  data: {
    selected: '' 
  }
})
</script>

修饰符

.lazy

因为在默认情况下, v-model 利用的是 input 事件来同步输入框的值与数据,如果你希望得到的是控件失去焦点的时候才触发动作(失去焦点之前不想触发动作),那你其实想要的是change事件,这时候,你可以添加一个修饰符 lazy,这样Vue不再监听input事件,改为监听change事件,这在某些场合有用:

<div id="app">
  <p>input 元素:</p>
  <input v-model.lazy="message" placeholder="编辑我……">
  <p>消息是: {{ message }}</p>
    
  <p>textarea 元素:</p>
  <p style="white-space: pre">{{ message2 }}</p>
  <textarea v-model.lazy="message2" placeholder="多行文本输入……"></textarea>
</div>
 
<script>
new Vue({
  el: '#app',
  data: {
    message: 'Runoob',
    message2: '菜鸟教程\r\nhttp://www.runoob.com'
  }
})
</script>

.number

如果想自动将用户的输入值转为 Number 类型(如果原值的转换结果为 NaN 则返回原值),可以添加一个修饰符 number 给 v-model 来处理输入值。这用于前端过滤用户输入。

比如我们希望用户输入电话号码,当用户打算输入132-7311-5000,就只会输入132,这会迫使用户输入正确的数字。

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

.trim

过滤用户输入的前后无用字符,不多解释。

<input v-model.trim="msg">
上一篇 下一篇

猜你喜欢

热点阅读