十、v-model的基本使用

一、v-model的基本使用

表单提交是开发中非常常见的功能,也是和用户交互的重要手段:

  • 比如用户在登录、注册时需要提交账号密码;
  • 比如用户在检索、创建、更新信息时,需要提交一些数据;

这些都要求我们可以在代码逻辑中获取到用户提交的数据,我们通常会使用v-model指令来完成:

  • v-model指令可以在表单 input、textarea以及select元素上创建双向数据绑定
  • 它会根据控件类型自动选取正确的方法来更新元素;
  • 尽管有些神奇,但 v-model 本质上不过是语法糖,它负责监听用户的输入事件来更新数据,并在某种极端场景下进行一些特殊处理;

input里面的value属性,是决定当前输入框里的默认值的。

此时我想把meesage绑定成input里面的默认的值,我该怎么去操作呢?

是不是可以这样子操作:

<input type="text" :value="message" />

那此时我在页面输入框里输入新的值的时候,是不是我还得把输入的内容再传给message?

那我有一个疑惑,我怎么才能把我输入的内容再绑定给message呢?如果我页面input输入的内容发生改变,data里面的message是不会随之发生改变的,因为他目前不知道输入框内容发生改变。

那我们怎么能让data里面的message知道呢?

 其实,当我们在input输入框里输入内容的时候,其实他会触发一个事件(v-on:input事件),这里message发生改变之后,下面的h2标签里面的message页面也会发生改变。

 但是每次都要这么去这么写的话是不是很麻烦,我每次都要绑定value,然后绑定input事件。

<!-- 1. 手动的实现了双向绑定 -->
<input type="text" :value="message" @input="inputChange" />

<!-- 2.  v-model实现双向绑定-->
<input type="text" v-model="message" />





<script>
      const app = Vue.createApp({
        // data: option api
        data() {
          return {
            message: "Hello Vue",
          }
        },
        methods: {
          inputChange(event) {
            this.message = event.target.value
          },
        },
      })

      app.mount("#app")
</script>

二、v-model的原理

官方有说到,v-model的原理其实是背后有两个操作:

  • v-bind绑定value属性的值
  • v-on绑定input事件监听到函数中,函数会获取最新的值赋值到绑定的属性中; 

三、实战场景

输入账号密码、点击登录获取账号密码的值。

这边提一下label标签哈~

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <div id="app">
      <!-- 1. 手动的实现了双向绑定 -->
      <!-- <input type="text" :value="message" @input="inputChange" /> -->

      <!-- 2.  v-model实现双向绑定-->
      <!-- <input type="text" v-model="message" /> -->

      <!-- 3. 登录功能 -->
      <!-- label聚焦 点击账号两个字能聚焦到输入框内,其中label里面的for就是对应的input输入框里面的id -->
      <label for="account"> 账号: <input id="account" type="text" v-model="account" /> </label>
      <label for="password"> 密码: <input id="password" type="password" v-model="password" /> </label>

      <button @click="loginClick">登录</button>
      <h2>{{message}}</h2>
    </div>
    <script src="../lib/vue.js"></script>

    <script>
      const app = Vue.createApp({
        // data: option api
        data() {
          return {
            message: "Hello Vue",
            account: "",
            password: "",
          }
        },
        methods: {
          // inputChange(event) {
          //   this.message = event.target.value
          // },
          loginClick() {
            const account = this.account
            const password = this.password

            // 发送网络请求
            console.log(account, password)
          },
        },
      })

      app.mount("#app")
    </script>
  </body>
</html>

四、v-model绑定textarea

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <div id="app">
      <textarea name="" id="" cols="30" rows="10" v-model="content"></textarea>
      <p>输入的内容: {{content}}</p>
    </div>
    <script src="../lib/vue.js"></script>

    <script>
      const app = Vue.createApp({
        // data: option api
        data() {
          return {
            // form name的作用  label的作用
            content: "",
          }
        },
      })

      app.mount("#app")
    </script>
  </body>
</html>

 

五、v-model绑定checkbox

(1)单个勾选框

通过label里面的for属性和input里面的id属性 对应起来,就能点击文本”同意协议“,也能达到勾选的效果。

① checkbox单选框:绑定到属性中的值是一个Boolean类型

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <div id="app">
      <!-- 1. checkbox单选框 -->
      <label for="agreement"> <input id="agreement" type="checkbox" v-model="isAgree" />同意协议 </label>
      <h2>单选框: {{isAgree}}</h2>
    </div>
    <script src="../lib/vue.js"></script>

    <script>
      const app = Vue.createApp({
        // data: option api
        data() {
          return {
            isAgree: false,
          }
        },
      })

      app.mount("#app")
    </script>
  </body>
</html>

这跟你绑定的data里面isAgree初始值是啥没关系。我们可以做一个实验。

 勾选单选框之后 :

再取消勾选之后:

② 此时input的value属性并不影响v-model的值

先看下面的复选框之后再来看这个哈~

 (2)多个复选框

hobbies是用来保存你选中的值的,但是你选择的具体是哪个值我是不知道的。所以我得在每个checkbox里面添加value属性。

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <div id="app">
      <!-- 1. checkbox单选框:绑定到属性中的值是一个Boolean类型 -->
      <label for="agreement"> <input id="agreement" type="checkbox" v-model="isAgree" />同意协议 </label>
      <h2>单选框: {{isAgree}}</h2>
      <hr />
      <!-- 2. checkbox 多选框: 绑定到属性中的值是一个数组array-->
      <!-- 注意:多选框当中,必须明确的绑定一个value值 -->
      <div class="hobbies">
        <h2>请选择你的爱好:</h2>
        <label for="sing"> <input id="sing" type="checkbox" v-model="hobbies" value="sing" />唱 </label>
        <label for="jump"> <input id="jump" type="checkbox" v-model="hobbies" value="jump" />跳 </label>
        <label for="rap"> <input id="rap" type="checkbox" v-model="hobbies" value="rap" />rap </label>
        <label for="basketball"> <input id="rap" type="checkbox" v-model="hobbies" value="basketball" />篮球 </label>
        <h2>爱好:{{hobbies}}</h2>
      </div>
    </div>
    <script src="../lib/vue.js"></script>

    <script>
      const app = Vue.createApp({
        // data: option api
        data() {
          return {
            isAgree: false,
            hobbies: [],
          }
        },
      })

      app.mount("#app")
    </script>
  </body>
</html>

(3)总结

六、v-model绑定radio

 通过页面发现,目前是都可以勾选上的。

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <div id="app">
      <div class="gender">
        <label for="male"> <input id="male" type="radio" /> 男 </label>
        <label for="female"> <input id="female" type="radio" /> 女 </label>
      </div>
    </div>
    <script src="../lib/vue.js"></script>

    <script>
      const app = Vue.createApp({
        // data: option api
        data() {
          return {
            message: "Hello Vue",
          }
        },
      })

      app.mount("#app")
    </script>
  </body>
</html>

那我们怎么让他只能选择一个呢?怎么让他们互斥呢?

设置name属性后就会互斥。

 我们现在希望将选择的男或者女这个值绑定到data里面。

我们该怎么做?没错,添加value属性。

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <div id="app">
      <div class="gender">
        <label for="male"> <input id="male" type="radio" v-model="gender" name="gender" value="male" /> 男 </label>
        <label for="female"> <input id="female" type="radio" v-model="gender" name="gender" value="female" /> 女 </label>
        <h2>gender值为: {{gender}}</h2>
      </div>
    </div>
    <script src="../lib/vue.js"></script>

    <script>
      const app = Vue.createApp({
        // data: option api
        data() {
          return {
            gender: "",
          }
        },
      })

      app.mount("#app")
    </script>
  </body>
</html>

那再来一个需求:我怎么给他默认选择女呢?

我们可以把data里面的gender设置一个初始值female。

注意: 前面我们说添加name让他们互斥。但是如果你v-model绑定了同一个数据,比如说是gender。那不需要添加name他们也是互斥的。

 七、v-model绑定select

跟上面一样,只不过这次v-model需要卸载<select>里面,而不是<option>里面。

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <div id="app">
      <!-- select单选 -->
      <select v-model="fruit">
        <option value="apple">苹果</option>
        <option value="orange">橘子</option>
        <option value="banana">香蕉</option>
      </select>
      <h2>单选: {{fruit}}</h2>
      <hr />

      <!-- select多选 -->
      <select multiple size="3" v-model="fruits">
        <option value="apple">苹果</option>
        <option value="orange">橘子</option>
        <option value="banana">香蕉</option>
      </select>
      <h2>多选: {{fruits}}</h2>
    </div>
    <script src="../lib/vue.js"></script>

    <script>
      const app = Vue.createApp({
        // data: option api
        data() {
          return {
            fruit: "orange",
            fruits: [],
          }
        },
      })

      app.mount("#app")
    </script>
  </body>
</html>

 

 总结:

八、v-model的值绑定

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <div id="app">
      <!-- select的值绑定 -->
      <select multiple size="2" v-model="fruits">
        <option v-for="item in allFruits" :key="item.value">{{item.text}}</option>
      </select>
      <h2>多选: {{fruits}}</h2>
      <hr />

      <!-- 2. checkbox的值绑定 -->
      <div class="hobbies">
        <h2>请选择你的爱好:</h2>
        <template v-for="item in allHobbies" :key="item.value">
          <label for="item.value"> <input :id="item.value" type="checkbox" v-model="hobbies" :value="item.text" />{{item.text}} </label>
        </template>
        <h2>爱好:{{hobbies}}</h2>
      </div>
    </div>
    <script src="../lib/vue.js"></script>

    <script>
      const app = Vue.createApp({
        // data: option api
        data() {
          return {
            // 水果
            allFruits: [
              { value: "apple", text: "苹果" },
              { value: "orange", text: "橘子" },
              { value: "banana", text: "香蕉" },
            ],
            fruits: [],

            // 爱好
            allHobbies: [
              { value: "sing", text: "唱" },
              { value: "jump", text: "跳" },
              { value: "rap", text: "rap" },
              { value: "basketball", text: "篮球" },
            ],
            hobbies: [],
          }
        },
      })

      app.mount("#app")
    </script>
  </body>
</html>

 

九、v-model修饰符

(1)lazy修饰符

lazy修饰符是什么作用呢?

  • 默认情况下,v-model在进行双向绑定时,绑定的是input事件,那么会在每次内容输入后就将最新的值和绑定的属性进行同步;
  • 如果我们在v-model后跟上lazy修饰符,那么会将绑定的事件切换为 change 事件,只有在提交时(比如回车)才会触发;
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <div id="app">
      <!-- 1. lazy -->
      <input type="text" v-model="message" />
      <h2>{{ message }}</h2>
    </div>
    <script src="../lib/vue.js"></script>

    <script>
      const app = Vue.createApp({
        // data: option api
        data() {
          return {
            message: "Hello Vue",
          }
        },
      })

      app.mount("#app")
    </script>
  </body>
</html>

 当我们加了lazy修饰符之后,在输入的时候不会message不会一直变,当在提交时或者光标脱离输入框的时候,message才会改变。

 

 

 (2)number修饰符

我们看下这个案例,虽然count的值一开始是数字类型,但是一旦用户输入内容过后,就变成了字符串类型。

 

 那我们加上修饰符number之后呢?那就变成数字类型了。

 

但是如果input输入框本身就是个数字类型的,那就没有必要给他加number修饰符。

<input type="number" v-model="counter2" />

另外,在我们进行逻辑判断时,如果是一个string类型,在可以转化的情况下会进行隐式转换的: 

 

(3)trim修饰符

如果要自动过滤用户输入的守卫空白字符,可以给v-model添加 trim 修饰符: 

 


 添加之后:

 


  注意:浏览器会对空格进行合并

 

(4)使用多个修饰符

<input type="text" v-model.lazy.trim="content" />

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/15140.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

系统分析师《企业信息化战略与实施》高频知识点

企业信息化战略与实施---企业信息化与电子商务 业务流程重组&#xff08;Business Process Reengineering BPR&#xff09;是针对企业业务流程的基本问题进行反思&#xff0c;并对它进行彻底的重新设计&#xff0c;使业绩取得显著性提高。与目标管理、全面质量管理、战略管理等…

输入捕获实验

实验内容 用TIM5 的通道 1&#xff08;PA0&#xff09;来做输入捕获&#xff0c;捕获 PA0 上高电平的脉宽&#xff08;用 WK_UP 按键输入高电平&#xff09;&#xff0c;通过串口打印高电平脉宽时间。 输入捕获简介 输入捕获模式可以用来测量脉冲宽度或者测量频率。STM32 的…

快速搭建Electron+Vite3+Vue3+TypeScript5脚手架 (无需梯子,快速安装Electron)

一、介绍 &#x1f606; &#x1f601; &#x1f609; Electron是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。 嵌入 Chromium 和 Node.js 到 二进制的 Electron 允许您保持一个 JavaScript 代码代码库并创建 在Windows上运行的跨平台应用 macOS和Linux——不需…

宝塔面板搭建自己的网站,并发布公网远程访问

文章目录 1. 环境安装2. 安装cpolar内网穿透3. 内网穿透4.固定http地址5. 配置二级子域名6.创建一个测试页面 宝塔面板简单几步搭建本地web站点&#xff0c;并做内网穿透&#xff0c;实现公网用户也可以正常远程访问&#xff0c;无需公网IP&#xff0c;无需设置路由器。 1. 环…

Volatile系列(一):Volatile测试案例一可见性

系列文章 Volatile测试案例一可见性 目录 前言 测试1 逻辑 代码 结果 测试2 逻辑 代码 结果 结论 原理探讨&#xff08;可见性&#xff09; 前言 多线程是 JAVA 并发编程的主要应用&#xff0c;并发环境能大幅提高应用性能&#xff0c;提高 CPU 使用率&#xff0c…

优雅的接口防刷处理方案

前言 本文为描述通过Interceptor以及Redis实现接口访问防刷Demo 这里会通过逐步找问题&#xff0c;逐步去完善的形式展示 原理 通过ip地址uri拼接用以作为访问者访问接口区分 通过在Interceptor中拦截请求&#xff0c;从Redis中统计用户访问接口次数从而达到接口防刷目的 …

不应使用Excel进行项目资源规划的 7 个原因

项目资源规划早期仅限于基本分配和调度。因此&#xff0c;企业使用自制工具或excel表来执行这一简单功能。然而&#xff0c;随着技术和业务流程的发展&#xff0c;资源规划变得复杂&#xff0c;并包括其他组成部分&#xff0c;如预测和容量规划&#xff0c;优化等。 由于传统…

掌握好这几款TikTok数据分析工具,让你轻松提高曝光率!

为什么别人在TikTok发的普普通通的视频却有那么高的流量、几天内疯狂涨粉&#xff0c;而自己想破脑袋装饰自己的视频&#xff0c;结果却不如人意。 其实原因很简单&#xff0c;TikTok不像国内的抖音只面向中华民族&#xff0c;而是覆盖了150多个国家和75种语言用户&#xff0c…

【通信接口】UART、IIC、SPI

目录 一、预备知识 1、串行与并行 2、单工与双工 3、波特率 二、UART 三、IIC 四、SPI &#xff08;一对一、一对多&#xff09; 五、IIC、SPI异同点 参考文章&#xff1a;这些单片机接口&#xff0c;一定要熟悉&#xff1a;UART、I2C、SPI、TTL、RS232、RS422、RS485…

【Java EE初阶】计算机简介及多线程之创建线程

目录 1.计算机发展史 2.冯诺依曼体系 3.操作系统 操作系统的作用&#xff1a; 4.进程 1.PID&#xff08;进程编号&#xff09; 2.内存指针 应用程序申请到的内存中的首地址 3.文件描述符表 问&#xff1a;什么是并发&#xff1f;什么是并行&#xff1f; 4.进程的优先级&a…

卡尔曼滤波原理及代码

目录 一.简介 二.原理 1.先验估计原理 2.后验估计原理 3.总结 三.示例 一.简介 卡尔曼滤波&#xff08;Kalman filtering&#xff09;是一种利用线性系统状态方程&#xff0c;通过系统输入输出观测数据&#xff0c;对系统状态进行最优估计的算法&#xff0c;它可以在任意…

StarRocks 3.0 集群安装手册

本文介绍如何以二进制安装包方式手动部署最新版 StarRocks 3.0集群。 什么是 StarRocks StarRocks 是新一代极速全场景 MPP (Massively Parallel Processing) 数据库。StarRocks 的愿景是能够让用户的数据分析变得更加简单和敏捷。用户无需经过复杂的预处理&#xff0c;就可以…

同步辐射X射线断层扫描成像在各行业的应用

同步辐射X射线断层扫描成像在各行业的应用 同步辐射X射线断层扫描成像&#xff08;synchrotron radiation X-ray computed tomography&#xff0c;SRCT&#xff09;是一种非侵入式、高分辨率的成像技术&#xff0c;利用同步辐射光束产生的高强度、高亮度、单色性和相干性的X射线…

【面试】MySQL事务的12连问

文章目录 前言1. 什么是数据库事务&#xff1f;2. 事务的四大特性3. 事务的隔离级别有哪些&#xff1f;MySQL的默认隔离级别是什么&#xff1f;4. Mysql为什么选择RR作为默认隔离级别&#xff1f;5. 很多大厂为什么选择RC数据库隔离级别&#xff1f;6. 并发场景&#xff0c;数据…

Qt连接MySql数据库(本地和远程数据库均可)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 三种方法方法一 略方法二 使用ODBC设置mysql为数据源库1. 添加ODBC数据源&#xff0c;在控制面板中找到管理工具&#xff0c;其中有ODBC数据源 64位的&#xff0c;打…

数字孪生与元宇宙:数字化科技的双向融合之路

概念 &#xff08;1&#xff09;元宇宙&#xff08;Metaverse&#xff09;是一个虚拟的三维世界&#xff0c;由数字内容和物理世界中的现实空间相互交织而成&#xff0c;能够提供各种虚拟体验&#xff0c;例如虚拟现实、增强现实、虚拟社交、虚拟经济等。在元宇宙中&#xff0…

8种不同类型的防火墙

什么是防火墙&#xff1f; 防火墙是一种监视网络流量并检测潜在威胁的安全设备或程序&#xff0c;作为一道保护屏障&#xff0c;它只允许非威胁性流量进入&#xff0c;阻止危险流量进入。 防火墙是client-server模型中网络安全的基础之一&#xff0c;但它们容易受到以下方面的…

连ChatGPT都不懂的五一调休,到底怎么来的?

今天是周几&#xff1f; 你上了几天班了&#xff1f; 还要上几天班放假&#xff1f; 五一啥安排&#xff1f; 出行的票抢到了吗&#xff1f; 调休到底是谁发明的&#xff1f;&#xff01; 五一劳动节是要劳动吗&#xff1f; 为什么昨天是周一&#xff0c;今天还是周一&a…

差分优化算法——DE

&#x1f34e;道阻且长&#xff0c;行则将至。&#x1f353; 目录 一、DE1.步骤2.特点 二、DE Optimiza1.函数最小值问题2.差分进化算法求解2.Java 实现与结果绘图 一、DE 差分进化算法是一种基于群体智能的优化算法&#xff0c;由Storn和Price于1995年提出&#xff0c;最早用…

基于DSP+FPGA+ADS1282支持32Bit高精度数据采集方案(三)系统性能测试

系统性能分析与测试 本章将首先对系统电路的噪声和温漂进行分析&#xff0c;而后对采集系统的性能进行 测试&#xff0c;并对测试数据进行分析。 5.1 高精度 AD 转换电路噪声和温漂分析 5.1.1 电阻噪声与温漂 1 、电阻的噪声 电阻是一种噪声源&#xff0c;其严重程度取…