九、v-model的使用

01 v-model的使用和原理

1.1 v-model

  • 表单控件在实际开发中式非常常见的,特别是对于用户信息的提交,需要大量的表单
  • Vue中使用v-model指令来实现表单元素和数据的双向绑定
  • 案例解析:
    • 当我们在输入框输入内容时
    • 因为input中的v-model绑定了message,所以会实时将输入的内容传递给message,message发生改变
    • 当message发生改变时,因为上面我们使用Mustache语法,将message的值插入到DOM中,所以会发生响应的改变
    • 所以,通过v-model实现双向绑定
  • 我们也可以将v-model用在textarea中
  • v-model其实是一个语法糖,他背后的本质上是包含两个操作
  • v-bind绑定一个value属性
  • v-on指令给当前元素绑定input事件
<input type="text" v-model="message">
<!--等用于下面 -->
<input type="text" :value="message" @input="valueChange">
<input type="text" :value="message" @input="message = $event.target.value">
<h2>{{message}}</h2>

1.2 代码实战

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>01-v-model的使用</title>
</head>
<body>

<div id="app">
  <!--  双向绑定-->
  <input type="text" v-model="message">{{message}}
  <hr>
  <!--  单向绑定实现双向绑定-->
  <!--  value动态单项绑定message -->
  <!--  input有一个事件,用于监听用户的输入,反向绑定message的值,实现双向绑定-->
  <input type="text" :value="message" @input="valueChange">
  <hr>
  <!--  另一种写法,不用函数调用,直接用$event-->
  <input type="text" :value="message" @input="message = $event.target.value">
</div>

<script type="text/javascript" src="../js/vue.js"></script>
<!--如果没有安装vue.js,就用下面的代码-->
<!--<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>-->
<script type="text/javascript">
  const vm = new Vue({
    el: '#app',
    data: {
      message: 'hello world!'
    },
    methods: {
      valueChange(event){
        //一旦在界面中产生一个事件,浏览器会自动生成一个event对象
        //event对象中,有我们需要value,在event中的target中
        //在调用函数中,如果省略的实参,而定义函数时,有形参,会自动将event当做实参传入
        this.message = event.target.value;
      }
    }
  })
</script>
</body>
</html>

1.3 运行结果

在这里插入图片描述

02-v-model结合radio类型

2.1 实战代码

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>02-v-model结合radio类型</title>
</head>
<body>

<div id="app">
  <label for="male">
    <!--  如果不加name,会导致可以同时勾选男女,加上name,那么提交给数据库的时候,key是唯一的sex,所以只能选一个-->
    <!--<input type="radio" id="male" name="sex" value="男">男-->
    <!--  当然了,如果我们加上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 type="text/javascript" src="../js/vue.js"></script>
<!--如果没有安装vue.js,就用下面的代码-->
<!--<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>-->
<script type="text/javascript">
  const vm = new Vue({
    el: '#app',
    data: {
      sex: '男'
    }
  })
</script>
</body>
</html>

2.2 运行结果

在这里插入图片描述

03-v-model结合checkbox类型

3.1 v-model:checkbox

  • 复选框分为两种情况:单个勾选框和多个勾选框
  • 单个勾选框:
    • v-model即为布尔值
    • 此时input的value并不影响v-model的值
  • 多个复选框:
  • 当是多个复选框时,因为可以选中多个,所以对应的data中属性是一个数组
  • 当选中某一个时,就会将input的value添加到数组中

3.2 代码实战

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>03-v-model结合checkbox类型</title>
</head>
<body>

<div id="app">
  <h2>{{message}}</h2>
  <label for="license">
    <input type="checkbox" id="license" v-model="isAgree">同意协议
  </label>
  <h2>您选择的是:{{isAgree}}</h2>
  <button :disabled="!isAgree">下一步</button>
  <hr>
  <!--  label没有id,那么点击文字,就不能达到勾选的目的,就只能去点击框勾选-->
  <label for="">
    <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">足球
    <input type="checkbox" value="乒乓球" v-model="hobbies">乒乓球
  </label>
  <h2>您选择的是:{{hobbies}}</h2>
</div>

<script type="text/javascript" src="../js/vue.js"></script>
<!--如果没有安装vue.js,就用下面的代码-->
<!--<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>-->
<script type="text/javascript">
  const vm = new Vue({
    el: '#app',
    data: {
      message: 'hello world!',
      isAgree: false,
      hobbies: []
    }
  })
</script>
</body>
</html>

3.3 运行结果

在这里插入图片描述

04-v-model结合select类型

4.1 v-model:select

  • 和checkbox一样,select也分单选和多选两种情况
  • 单选:只能选中一个值
    • v-model绑定的是一个值
    • 当我们选中option中的一个时,会将它对应的value赋值到mySelect中
  • 多选:可以选中多个值
    • v-model绑定的是一个数组
    • 当选中多个值时,就会将选中的option对应的value添加到数组mySelects中

4.2 代码实战

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>04-v-model结合select类型</title>
</head>
<body>

<div id="app">
  <!--  1.选择一个-->
  <select name="fruits" 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>
  <hr>
  <!--  1.选择多个-->
  <select name="fruits" v-model="fruits" multiple>
    <option value="苹果">苹果</option>
    <option value="香蕉">香蕉</option>
    <option value="榴莲">榴莲</option>
    <option value="葡萄">葡萄</option>
    <option value="哈密瓜">哈密瓜</option>
  </select>
  <h2>您选择的水果是:{{fruits}}</h2>
  <hr>
</div>

<script type="text/javascript" src="../js/vue.js"></script>
<!--如果没有安装vue.js,就用下面的代码-->
<!--<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>-->
<script type="text/javascript">
  const vm = new Vue({
    el: '#app',
    data: {
      fruit: '',
      fruits: []
    }
  })
</script>
</body>
</html>

4.3 运行结果

在这里插入图片描述

05-v-model修饰符的使用

5.1 v-model

  • lazy修饰符
    • 默认情况下,v-model默认是在input事件中同步输入框的数据
    • 也就是说,一旦有数据发生改变对应的data中的数据就会自动发生改变
    • lazy修饰符可以让数据在失去焦点或者回车时才会更新
  • number修饰符
    • 默认情况下,在输入框无论我们输入的是字母还是数字,都会被当做字符串类型进行处理
    • 但是如果我们希望处理的是数字类型,那么最好直接将内容当做数字处理
    • number修饰符可以让在输入框中输入的内容自动转成数字类型
  • trim修饰符
    • 如果输入的内容首尾有很多空格,通常我们希望将其去掉
    • trim修饰符可以过滤内容左右两边的空格

5.2 代码实战

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>05-v-model修饰符的使用</title>
</head>
<body>

<div id="app">
  <!--  1.修饰符:lazy-->
  <!--  没有加lazy之前,实时绑定,加上之后,回车绑定-->
  <input type="text" v-model.lazy="message"><br>
  <h2>{{message}}</h2>
  <!--  2.修饰符:number-->
  <input type="number" v-model.number="age"><br>
  <h2>{{age}}——{{typeof age}}</h2>
  <!--  3.修饰符:trim-->
  <input type="text" v-model.trim="name">
  <h2>您输入的名字是:{{name}}</h2>
</div>
</div>

<script type="text/javascript" src="../js/vue.js"></script>
<!--如果没有安装vue.js,就用下面的代码-->
<!--<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>-->
<script type="text/javascript">
  const vm = new Vue({
    el: '#app',
    data: {
      message:'',
      age:'',
      name:''
    }
  })
</script>
</body>
</html>

5.3 运行结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值