表单输入绑定(Vue2笔记)

104 阅读2分钟

基础语法

可以用v-model指令在表单<input> <textarea> <select> 元素上创建双向数据绑定。它会根据空间类型自动选取正确的方法来更新元素,负责监听用户的输入事件以更新数据,并对一些极端场景进行一些特殊处理。

v-model会忽略所有表单元素的value checked selected attribute的初始值而总是将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: ''
      }
    })

结果:
image.png

选择框

单选时:

<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: ''
      }
    })

结果:

image.png

如果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: []
      }
    })

结果:

image.png
用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' }
        ]
      }
    })

结果:

image.png

修饰符

.lazy

可以在change事件触发后将输入框的值与数据进行同步:

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

.number

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

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

.trim

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

<input v-model.trim="message">