v-model| 青训营笔记

131 阅读3分钟

这是我参与「第四届青训营 」笔记创作活动的的第20天

表单控件在实际开发中是非常常见的。特别是对于用户信息的提交,需要大量的表单。 Vue中使用v-model指令来实现表单元素和数据的双向绑定。

v-model原理

v-model其实是一个语法糖,它的背后本质上是包含两个操作︰

  1. v-bind绑定一个value属性
  2. v-on指令给当前元素绑定input事件
<div id='app'>
<!-- <input type="text" v-model="messege"> -->
<!-- <input type="text" :value="messege" @input="valuechange"> -->
<input type="text" :value="messege" @input="messege = $event.target.value">

{{messege}}
</div>
<script src='./vue.js'></script>
<script>
  const app = new Vue({
      el : '#app',
      data : {
        messege : 'hello world'
      },
      methods : {
        valuechange(event){
          this.messege = event.target.value
        }
      },
      computed : {}
  })
</script>

数据双向绑定

默认情况下Vue只支持数据单向传递 M-> VM -> V 但是由于Vue是基于MVVM设计模式的,所以也提供了双向传递的能力 在<input><textarea><select> 元素上可以用 v-model 指令创建双向数据绑定

注意点:v-model会忽略所有表单元素的 value、checked、selected 特性的初始值 而总是将 Vue实例 的数据作为数据来源


input值绑定

仔细阅读之后,发现很简单,就是动态的给value赋值而已: 我们前面的value中的值,可以回头去看一下,都是在定义input的时候直接给定的。 但是真实开发中,这些input的值可能是从网络获取或定义在data中的。 所以我们可以通过v-bind:value动态的给value绑定值。 这不就是v-bind吗?

<div id='d'>
  <label v-for="item in originHobbies">
    <input type="checkbox" :value="item" v-model="hobbies">{{item}}
  </label>
  <h3>{{hobbies}}</h3>
</div>
<script src='./vue.js'></script>
<script>
    const d = new Vue({
        el : '#d',
        data : {
          isAgree : false,
          hobbies : [],
          originHobbies : ['抽烟','喝酒','烫头']
        },
        methods : {},
        computed : {}
    })
</script>

修饰符

lazy修饰符∶

默认情况下, v-model默认是在input事件中同步输入框的数据的。 也就是说,—旦有数据发生改变对应的data中的数据就会自动发生改变。

lazy修饰符可以让数据在失去焦点或者回车时才会更新:

  1. input事件在用户输入的时候会实时地、连续地触发
  2. blur事件在输入框失去焦点时触发;
  3. change事件在用户输入的值与上一次输入的值不同。并且输入框失去焦点时触发。

number修饰符:

默认情况下,在输入框中无论我们输入的是字母还是数字,都会被当做字符串类型进行处理。 但是如果我们希望处理的是数字类型,那么最好直接将内容当做数字处理。

number修饰符可以让在输入框中输入的内容自动转成数字类型

trim修饰符:

如果输入的内容首尾有很多空格,通常我们希望将其去除

trim修饰符可以过滤内容左右两边的空格

<div id='e'>
  <!-- 1. lazy 修饰符 -->
  <input type="text" v-model.lazy="messege">
  <h4>{{messege}}</h4>

  <!-- 2. number 修饰符 -->
  <input type="number" v-model.number="age">
  <h4>{{age}}--{{typeof age}}</h4>

  <!-- 3. trim 修饰符 -->
  <input type="text" v-model.trim.lazy="name">
  <h4>你输入的名字:{{name}}</h4>

</div>
<script src='./vue.js'></script>
<script>
    const e = new Vue({
        el : '#e',
        data : {
          messege : 'hello world',
          age : 0,
          name : ''
        },
        methods : {},
        computed : {}
    })
</script>

v-model:radio

相同的name,在提交表单时只会提交一份,所以会互斥

label是将内容绑到一起,不用必须点击圆圈

<div id='a'>
  <label for="male">
    <input type="radio" id="male" name="gender" value="男" v-model="gender"></label>
  <label for="female">
    <input type="radio" id="female" name="gender" value="女" v-model="gender"></label>
  <h3>您选择的性别是:{{gender}}</h3>
</div>
<script src='./vue.js'></script>
<script>
    const a = new Vue({
        el : '#a',
        data : {
          gender : '男'
        },
        methods : {},
        computed : {}
    })
</script>

v-model:checkbox

复选框分为两种情况∶单个勾选框和多个勾选框 复选框绑定的值是字符串类型的时候获得布尔值,如果是数组则是取value值 要获取多个value只能使用数组[],不能使用对象或者其他

<div id='b'>
  <!-- 单选框 -->
  <label>
    <input type="checkbox" v-model="isAgree">同意协议
  </label>
  <h3>{{isAgree}}</h3>

  <!-- 多选框 -->
  <label> <input type="checkbox" v-model="hobbies" value="篮球">篮球 </label>
  <label> <input type="checkbox" v-model="hobbies" value="足球">足球 </label>
  <label> <input type="checkbox" v-model="hobbies" value="羽毛球">羽毛球 </label>
  <label> <input type="checkbox" v-model="hobbies" value="乒乓球">乒乓球 </label>
  <h3>{{hobbies}}</h3>
</div>
<script src='./vue.js'></script>
<script>
    const b = new Vue({
        el : '#b',
        data : {
          isAgree : false,
          hobbies : []
        },
        methods : {},
        computed : {}
    })
</script>

v-model:select

和checkbox一样,select也分为单选和双选两种情况

单选:只能选中一个值。 v-model绑定的是一个值。 当我们选中option中的一个时,会将它对应的value赋值到mySelect中 多选:可以选中多个值。 v-model绑定的是一个数组。 当选中多个值时,就会将选中的option对应的value添加到数组mySelects中

<div id='c'>
  <!-- 选择一个 -->
  <select name="aaa" v-model="drink">
    <option value="可乐">可乐</option>
    <option value="雪碧">雪碧</option>
    <option value="营养快线">营养快线</option>
    <option value="奶茶">奶茶</option>
    <option value="牛奶">牛奶</option>
  </select>
  <h3>{{drink}}</h3>

  <!-- 选择多个 多选要加属性 multiple  按住ctrl键选择-->
  <select name="aaa" v-model="drinks" multiple>
    <option value="可乐">可乐</option>
    <option value="雪碧">雪碧</option>
    <option value="营养快线">营养快线</option>
    <option value="奶茶">奶茶</option>
    <option value="牛奶">牛奶</option>
  </select>
  <h3>{{drinks}}</h3>
</div>
<script src='./vue.js'></script>
<script>
    const c = new Vue({
        el : '#c',
        data : {
          drink : '奶茶',
          drinks : []
        },
        methods : {},
        computed : {}
    })
</script>