美文网首页
v-model 指令(表单双向绑定)

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

作者: microkof | 来源:发表于2017-12-07 10:44 被阅读580次

    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">
    

    相关文章

      网友评论

          本文标题:v-model 指令(表单双向绑定)

          本文链接:https://www.haomeiwen.com/subject/emllixtx.html