美文网首页
Vue v-model表单双向绑定

Vue v-model表单双向绑定

作者: 奋斗的小马达 | 来源:发表于2021-07-23 15:27 被阅读0次

    一、背景

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

    二、案例的解析
    当我们在输入框输入内容时因为input中的v-mode|绑定了message ,所以会实时将输入的
    内容传递给message , message发生改变。

    当message发生改变时, 因为上面我们使用Mustache语法,将message的值插入到DOM中,所以DOM会发生响应的改变。所以,通过v-model实现了双向的绑定。


    代码.png

    当然,我们也可以将v-model用于textarea元素 如下图


    代码块.png

    三、原理
    v-model其实是一 个语法糖,它的背后本质上是包含两个操作:
    01.v-bind绑定一个value属性
    02.v-on指令给当前元素绑定input事件
    也就是说下面的代码:等同于下面的代码:

    <input type= "text" v-model="message">
    

    !--等同于下面-->

    <input type="text" v-bind: value="message" v-on :input="message = $event . target. value">
    
    

    !--等同于下面-->

    <input type="text" v-bind : value= "message" v-on: input= "message = $event. target. value">
    
    

    四 、v-model 与radio 结合使用

    案例:做个单选框时
    代码:

    <template>
      <div class="hello">
        <label for="man">
          <input type="radio" value="男" name="sex" id="man" v-model="sex"> 男
        </label>
        <label for="woman">
          <input type="radio" value="女" name="sex" id="woman" v-model="sex"> 女
        </label>
    
        <h2>选择的性别是:{{sex}}</h2>
      </div>
    </template>
    <script>
    
    export default {
      name: 'HelloWorld',
      data() {
        return {
          sex: '男'//默认选择
        }
      },
    }
    </script>
    

    如上代码,如果没有 v-model时 只有加上name 属性且属性值一样才能互斥

    加上v-model时 name属性可以直接去掉 如下代码

    <template>
      <div class="hello">
        <label for="man">
          <input type="radio" value="男"  id="man" v-model="sex"> 男
        </label>
        <label for="woman">
          <input type="radio" value="女" id="woman" v-model="sex"> 女
        </label>
    
        <h2>选择的性别是:{{sex}}</h2>
      </div>
    </template>
    <script>
    
    export default {
      name: 'HelloWorld',
      data() {
        return {
          sex: '男'//默认选择
        }
      },
    }
    </script>
    

    五、v-model与cheekbox结合使用

    1、单选框类型

    <template>
      <div class="hello">
        <label for="agree">
          <input type="checkbox" id="agree" v-model="isArgee">同意协议
        </label>
        <h2>选择的是:{{isArgee}}</h2>
      </div>
    </template>
    <script>
    export default {
      name: 'HelloWorld',
      data() {
        return {
          isArgee: false//默认选择
        }
      },
    }
    </script>
    

    2、复选框

    <template>
      <div class="hello">
        <input type="checkbox" value="篮球" v-model="hobbies">篮球
        <input type="checkbox" value="足球" v-model="hobbies">足球
        <input type="checkbox" value="乒乓球" v-model="hobbies">乒乓球
        <input type="checkbox" value="羽毛球" v-model="hobbies">羽毛球
        <h2>选择的是:{{hobbies}}</h2>
      </div>
    </template>
    <script>
    export default {
      name: 'HelloWorld',
      data() {
        return {
          hobbies: []//默认选择
        }
      },
    }
    </script>
    

    等同于(推荐使用)

    <template>
      <div class="hello">
        <label v-for="item in hobbies" :for="item">
          <input type="checkbox" :value="item" :id="item" v-model="myHobbies">{{item}}
        </label>
        <h2>选择的是:{{myHobbies}}</h2>
      </div>
    </template>
    <script>
    export default {
      name: 'HelloWorld',
      data() {
        return {
          hobbies: ['篮球', "足球", "乒乓球", "羽毛球"],
          myHobbies: []
        }
      },
    }
    </script>
    
    

    六、v-model与select结合使用
    1、选一个

    <template>
      <div class="hello">
        <select name="xxx" id="" v-model="fruit">
          <option value="苹果">苹果</option>
          <option value="香蕉">香蕉</option>
          <option value="橘子">橘子</option>
          <option value="西瓜">西瓜</option>
          <option value="葡萄">葡萄</option>
          <option value="桃子">桃子</option>
        </select>
        <h2>选择的是:{{fruit}}</h2>
      </div>
    </template>
    <script>
    export default {
      name: 'HelloWorld',
      data() {
        return {
          fruit: '橘子'//默认选择
        }
      },
    }
    </script>
    
    

    七、v-model修饰符
    1、lazy修饰符:
    默认情况下, v-model默认是在input事件中同步输入框的数据的。
    也就是说,一旦有数据发生改变对应的data中的数据就会自动发生
    改变。
    lazy修饰符可以让数据在失去焦点或者回车时才会更新: .

    <template>
      <div class="hello">
        <input type="text" value="message" v-model.lazy="message">
        <h2>输入的内容是:{{message}}</h2>
      </div>
    </template>
    <script>
    export default {
      name: 'HelloWorld',
      data() {
        return {
       message: "你好啊"
        }
      },
    }
    </script>
    
    

    2、number修饰符:
    默认情况下,在输入框中无论我们输入的是字母还是数字,都会被
    当做字符串类型进行处理。
    但是如果我们希望处理的是数字类型,那么最好直接将内容当做数
    字处理。
    number修饰符可以让在输入框中输入的内容自动转成数字类型:

    <template>
      <div class="hello">
        <input type="number" value="age" v-model.number="age">
        <h2>您的年龄是:{{age}}</h2>
      </div>
    </template>
    <script>
    export default {
      name: 'HelloWorld',
      data() {
        return {
       age: 10
        }
      },
    }
    </script>
    

    3、trim修饰符:
    如果输入的内容首尾有很多空格,通常我们希望将其去除
    trim修饰符可以过滤内容左右两边的空格

    注意:在使用trim的时候 我们的浏览器在显示的时候会主动把浏览器空格去掉 所以在页面上你是看不出来的 需要打印真实数据才能看出来

    <template>
      <div class="hello">
        <input type="text" value="name" v-model.trim="name">
        <h2>您的名字是:{{name}}</h2>
      </div>
    </template>
    <script>
    export default {
      name: 'HelloWorld',
      data() {
        return {
       name: '张山'
        }
      },
    }
    </script>
    
    

    相关文章

      网友评论

          本文标题:Vue v-model表单双向绑定

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