从“心”认识Vue(三):再谈v-model

本文详细探讨了Vue中的v-model特性,包括它如何实现双向数据绑定,以及在text输入框、radio单选框、checkbox多选框和select下拉菜单中的应用。还介绍了v-model的值绑定和修饰符,如lazy、number和trim,帮助读者更深入理解Vue的数据绑定机制。
摘要由CSDN通过智能技术生成


前言

开始学习vue了,但是编程的思想还是不容易转变过来,一两周过去了,只知道个大概,知其然而不知其所以然,打算开一个系列帖,重新认识下vue。


一、v-model的基本使用

vue中使用v-model实现表单元素和数据的双向绑定。

1.v-model绑定text输入框

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>
<div id="app">
  <input type="text" v-model="msg">
  <h3>{{msg}}</h3>
</div>

<script src="node_modules/vue/dist/vue.min.js"></script>
<script>
  new Vue({
    el: "#app",
    data: {
      msg: "haha"
    }
  })
</script>
</body>
</html>

2.v-model绑定原理

仔细看上面代码,看v-model都做了什么?

  • 第一步,使用v-bind绑定了值;
  • 第二步,使用了一个input事件实现值的同步输入

那么我们可以理解为这样:先用v-bind绑定value值,然后用通过v-on使用input事件,event.target.value为事件源的值

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>
<div id="app">

 <input type="text" :value="msg" @input="valChange">

  <h3>{{msg}}</h3>
</div>

<script src="node_modules/vue/dist/vue.min.js"></script>
<script>
  new Vue({
    el: "#app",
    data: {
      msg: "haha"
    },
    methods:{
      valChange(event){
        this.msg = event.target.value
      }
    }
  })
</script>
</body>
</html>

进而,input可以写成这样,事件方法就不用写了:

<input type="text" :value="msg" @input="msg=$event.target.value">

也就是上面代码等同于下面代码:

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

二、v-model与radio

  • v-model直接与单选框value值进行绑定
  • 定义了value值时,radio也会同时选中,基于双向绑定
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>
  <div id="app">
    <label for="male">
<!--      用v-model时name值不写时它们也是互斥的-->
      <input type="radio" id="male" value="" v-model="sex"></label>
    <label for="female">
      <input type="radio" id="female" value="" v-model="sex"></label>
    <h2>你选择的是:{{sex}}</h2>
    </div>

    <script src="node_modules/vue/dist/vue.min.js"></script>
    <script>
      new Vue({
        el:"#app",
        data:{
          msg:"haha",
          //sex默认是男,同时input也会被选中,基于双向绑定
          sex:"男"
        }
      })
    </script>
</body>
</html>

三、v-model与checkbox

1.单选框

  • v-model与checked是否选中绑定,绑定boolean值
  • 此时value与v-model无关
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>
  <div id="app">
    <label for="agree">
      <input type="checkbox" id="agree" v-model="isAgree">同意协议
    </label>
    <h2>你选择的是:{{isAgree}}</h2>
    <button :disabled="!isAgree">下一步</button>

    <script src="node_modules/vue/dist/vue.min.js"></script>
    <script>
      new Vue({
        el:"#app",
        data:{
          msg:"haha",
          isAgree:false,//单选框
        }
      })
    </script>
</body>
</html>

2.多选框

  • 多选时,v-model绑定的是一个数组
  • 当被选中时,value值就会加入数组中
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>
  <div id="app">

<!--  2.多选-->
    <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>


    <script src="node_modules/vue/dist/vue.min.js"></script>
    <script>
      new Vue({
        el:"#app",
        data:{
          msg:"haha",
          isAgree:false,//单选框
          hobbies:[],//多选框
        }
      })
    </script>
</body>
</html>

四、v-model与select下拉菜单

1.单选时

  • v-model绑定的是一个值
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>
  <div id="app">
<!--      1.选择一个-->
    <select name="fruit" id="" v-model="fruit">
      <option value="苹果">苹果</option>
      <option value="香蕉">香蕉</option>
      <option value="草莓">草莓</option>
    </select>
	<h2>你选择的是:{{fruit}}</h2>

    <script src="node_modules/vue/dist/vue.min.js"></script>
    <script>
      new Vue({
        el:"#app",
        data:{
          msg:"haha",
          fruit:"香蕉"
        }
      })
    </script>
</body>
</html>

2.多选时

  • 此时v-model绑定一个数组
  • 按住shift或ctrl多选时,value值会加入到数组中
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>
  <div id="app">

    <select name="fruit" id="" v-model="fruits" multiple>
      <option value="苹果">苹果</option>
      <option value="香蕉">香蕉</option>
      <option value="草莓">草莓</option>
    </select>
    <h2>你选择的是:{{fruits}}</h2>
    </div>

    <script src="node_modules/vue/dist/vue.min.js"></script>
    <script>
      new Vue({
        el:"#app",
        data:{
          msg:"haha",
          fruits:[]
        }
      })
    </script>
</body>
</html>

五、v-model的值绑定

  • 从data获取数据后,动态给value赋值
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>
  <div id="app">

<!--    3.值绑定-->
    <label v-for="item in originHobbies" :for="item">
      <input type="checkbox" :value="item" :id="item" v-model="hobbies">{{item}}
    </label>
    <h2>你选择的是:{{hobbies}}</h2>
  </div>

    <script src="node_modules/vue/dist/vue.min.js"></script>
    <script>
      new Vue({
        el:"#app",
        data:{
          msg:"haha",
          originHobbies:['篮球','足球','羽毛球','乒乓球','台球']
        }
      })
    </script>
</body>
</html>

六、v-model的修饰符

1.lazy

  • 默认情况下input输入框与v-model绑定值是同步输入的
  • lazy可以避免数据的频繁刷新,即只有失去焦点或者回车后数据才会进行更新
<input type="text" v-model.lazy="msg">
<h2>{{msg}}</h2>

2.number

  • 默认情况下v-model总是把输入的变量自动转换为字符串
  • number可以让输入的内容转换为number类型
    <input type="number" v-model.number="age">
    <h2>{{age}}--{{typeof age}}</h2>

3.trim

  • trim修饰符可以过滤内容左右两边的空格
   <input type="text" v-model.trim="name">
   <h2>名字:{{name}}</h2>

不加trim时网页渲染时显示不出来空格,实际上是有空格,在控制台里可以查看,如果不想出现空格,就加上trim。


总结

    1. v-model与input输入框绑定时双向绑定值;
    1. 与radio单选框绑定时绑定是否选中布尔值;
    1. 与checkbox多选框绑定时绑定值;
    1. 与select下拉菜单绑定时绑定值;
    1. v-model的值绑定是基于v-bind动态赋值value;
    1. v-model有修饰符。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值