v-model是什么?

v-model 是Vue框架的一种内置的API指令,本质是一种语法糖写法。它负责监听用户的输入事件以更新数据,并对一些极端场景进行一些特殊处理。

为什么使用v-model?

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

什么场景下会使用v-model?

表单提交是开发中非常常见的功能,也是和用户交互的重要手段:比如用户在登录、注册时需要提交账号密码;比如用户在检索、创建、更新信息时,需要提交一些数据; 这些都要求我们可以在代码逻辑中获取到用户提交的数据,我们通常会使用v-model指令来完成

示例:v-model的基本使用

v-model的原理

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

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

那v-model是双向绑定吗?

是的
你可以用 v-model 指令在表单 、 及 元素上创建双向数据绑定。 —— vue2官方文档

那 v-model 是单向数据流吗?

是的,
虽然官方没有明确表示这点,但我们可以捋一捋两者的关系。

什么是单项数据流?

父组件可以向值组件传递数据,并且改变值组件的值,而子组件不能改变父组件传递给它的 prop 属性,官方推荐的做法是它抛出事件,通知父组件自行改变绑定的值。

v-model 的做法是怎样的?

v-model 做法完全符合单项数据流。甚至于,它给出了一种在命名和事件定义上的规范。
众所周知 .sync 修饰符是单向数据流的另一个典型范式。

单向数据流:总结起来其实也就8个字:数据向下,事件向上。

那接下来,我们再来看一下v-model是如何绑定一下其他的表单类型:textarea、checkbox、radio、select等属性的

v-model绑定textarea

我们来看一下绑定textarea

  <div class="demo"><textarea v-model="article" cols="30" rows="10"> </textarea><h2>article当前的值是:{{ article }}</h2></div>
export default {name: 'demo',data () {return {article: "a"}}
}

效果:

v-model绑定checkbox

我们来看一下v-model绑定checkbox:单个勾选框和多个勾选框

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

单选框示例:

export default {name: 'demo',data () {return {isAgree: "true"}}
}

效果:

  <!-- 一般对应数组类型 --><input type="checkbox" v-model="sport" value="篮球" />篮球<input type="checkbox" v-model="sport" value="足球" />足球<input type="checkbox" v-model="sport" value="羽毛球球" />羽毛球球<input type="checkbox" v-model="sport" value="兵乓球" />兵乓球您的爱好有:{{ sport }}
export default {name: 'demo',data () {return {message: "内容",sex: '',// 当要 默认选中时要填入值即可 例:sex='男'// agree: false,sport: [],// fruits: '',// fruits2: [],// hobbies: [],// origintobbies: ["篮球", "足球", "乒乓球", "羽毛球", "桌球"],// age: 0,// name: ''}}
}

效果示例:

v-model绑定radio

v-model绑定radio,用于选择其中一项;

效果示例:

v-model绑定select

和checkbox一样,select也分单选和多选两种情况。

  • 单选:只能选中一个值,v-model绑定的是一个值。当我们选中option中的一个时,会将它对应的value赋值到fruit中;
  • 多选:可以选中多个值,v-model绑定的是一个数组。当选中多个值时,就会将选中的option对应的value添加到数组fruit中;
<select name="abc" v-model="fruits2" multiple><option value="香蕉">香蕉</option><option value="苹果">苹果</option><option value="橙子">橙子</option><option value="榴莲">榴莲</option></select>
export default {name: 'demo',data () {return {message: "内容",sex: '',//  当要 默认选中时要填入值即可 例:sex='男',agree: false,sport: [],fruits: '',fruits2: [],hobbies: [],origintobbies: ["篮球", "足球", "乒乓球", "羽毛球", "桌球"],age: 0,name: ''}}
}

效果示例:


效果示例:

v-model的值绑定

目前我们在前面的案例中大部分的值都是在template中固定好的:比如gender的两个输入框值male、female;比如hobbies的三个输入框值basketball、football、tennis.
在真实开发中,我们的数据可能是来自服务器的,那么我们就可以先将值请求下来,绑定到data返回的对象中,再通过v-bind来进行值的绑定,这个过程就是值绑定。这里不再给出具体的做法,因为还是v-bind的使用过程。

v-model修饰符 - lazy

lazy修饰符是什么作用呢?

默认情况下,v-model在进行双向绑定时,绑定的是input事件,那么会在每次内容输入后就将最新的值和绑定的属性进行同步;,如果我们在v-model后跟上lazy修饰符,那么会将绑定的事件切换为 change 事件,只有在提交时(比如回车)才会触发

      <!-- 修饰符    lazy/number/trim --><!-- lazy  失去焦点后才改变点击enter--><!-- 口默认情况下, V- model默认是在input事件中同步输入框的数据的。口也就是说, - -旦有数据发生改变对应的data中的数据就会自动发生 改变。口lazy修饰符可以让数据在失去焦点或者回车时才会更新:--><input type="text" v-model.lazy="message" /><br />{{ message }}
export default {name: 'demo',data () {return {message: "内容",sex: '',//  当要 默认选中时要填入值即可 例:sex='男',agree: false,sport: [],fruits: '',fruits2: [],hobbies: [],origintobbies: ["篮球", "足球", "乒乓球", "羽毛球", "桌球"],age: 0,name: ''}}
}

效果示例:

v-model修饰符 - number

我们先来看一下v-model绑定后的值是什么类型的:message总是string类型,即使在我们设置type为number也是string类型;

如果我们希望转换为数字类型,那么可以使用 .number 修饰符:

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


效果示例:

v-model修饰符 - trim

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

效果示例:

document.body.innerHTML = svg;

全部示例代码:

<!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><!-- 引入Vue --><script src="./vue.min.js"></script>
</head><body><div id="app"><!-- 表单绑定v-model的双向绑定 当我们在输入框输入内容时,因为input中的v-model绑定了message ,所以会实时将输入的内容传递给message , message发生改变。内容传递给message , message发生改变。message的值插入到DOM中,所以DOM会发生响应的改变。0所以,通过v-model实现了双向的绑定。--><input type="text" v-model="message"> {{message}}<br><!-- v-model和radio的结合使用 --><label for="man"><input type="radio" value="男" v-model='sex' id="man">男</label><label for="girl"><input type="radio" value="女" v-model='sex' id="girl">女</label> 您选中的是:{{sex}}<br><!-- 复选框   一般对应布尔类型--><label for="agree"><input type="checkbox" id="agree" v-model="agree">同意</label><button :disabled="!agree">下一步</button> 您的选择:{{agree}}<br><!-- 一般对应数组类型 --><input type="checkbox" v-model="sport" value="篮球">篮球<input type="checkbox" v-model="sport" value="足球">足球<input type="checkbox" v-model="sport" value="羽毛球球">羽毛球球<input type="checkbox" v-model="sport" value="兵乓球">兵乓球 您的爱好有:{{sport}}<br><!-- select  单选--><select name="abc" v-model='fruits'><option value="香蕉">香蕉</option><option value="苹果">苹果</option><option value="橙子">橙子</option><option value="榴莲">榴莲</option></select> 您选中的水果是{{fruits}}<br><br><!-- 多选 --><select name="abc" v-model="fruits2" multiple><option value="香蕉">香蕉</option><option value="苹果">苹果</option><option value="橙子">橙子</option><option value="榴莲">榴莲</option></select><br> 您选中的水果是{{fruits2}}<br><!-- 值绑定 --><label v-for="item in origintobbies" :for="item"><input type="checkbox" :value="item" :id="item" v-model="hobbies">{{item}}</label><br> 您的爱好是{{hobbies}}<br><!-- 修饰符    lazy/number/trim --><!-- lazy  失去焦点后才改变点击enter--><!-- 口默认情况下, V- model默认是在input事件中同步输入框的数据的。口也就是说, - -旦有数据发生改变对应的data中的数据就会自动发生 改变。口lazy修饰符可以让数据在失去焦点或者回车时才会更新:--><input type="text" v-model.lazy="message"><br> {{message}}<br><!-- number 转化为数字类型--><!-- 默认情况下,在输入框中无论我们输入的是字母还是数字,都会被 当做字符串类型进行处理。口但是如果我们]希望处理的是数字类型,那么最好直接将内容当做数字处理。o number修饰符可以让在输入框中输入的内容自动转成数字类型:--><input type="text" v-model.number="age"><br> {{age}}--{{typeof age}}<br><!-- trim 去除空格 --><!-- trim修饰符可以过滤内容左右两边的空格 --><input type="text " v-model.trim="name"><br> {{name}}</div><script>const app = new Vue({el: "#app",data: {message: "内容",sex: '',// 当要 默认选中时要填入值即可 例:sex='男'agree: false,sport: [],fruits: '',fruits2: [],hobbies: [],origintobbies: ["篮球", "足球", "乒乓球", "羽毛球", "桌球"],age: 0,name: ''},methods: {}})</script></body></html>

写在最后

伙伴们,如果你觉得我写的文章对你有帮助就给zayyo点一个赞

全网最详细的v-model讲解相关推荐

  1. Attention 和 Self-Attention [一万字拆解 Attention,全网最详细的注意力机制讲解]

    上一篇文章 从 RNN 到 Attention 我们在RNN的Encoder-Decoder框架下引入了Attention 机制,用来解决 RNN 模型中梯度下降以及性能瓶颈问题,如下图所示: 上图就 ...

  2. 大概是全网最详细的Electron ipc 讲解(二)——渲染进程与渲染进程的搭桥牵线

    希沃ENOW大前端 公司官网:CVTE(广州视源股份)[1] 团队:CVTE旗下未来教育希沃软件平台中心enow团队 「本文作者:」 image.png 前言 你盼世界,我盼望你无 bug .Hell ...

  3. 大概是全网最详细的Electron ipc 讲解(一)——主进程与渲染进程的两情相悦

    希沃ENOW大前端 公司官网:CVTE(广州视源股份) 团队:CVTE旗下未来教育希沃软件平台中心enow团队 「本文作者:」 image.png 前言 你盼世界,我盼望你无 bug .Hello 大 ...

  4. 大概是全网最详细的Electron ipc 讲解(三)——定情信物传声筒port

    希沃ENOW大前端 公司官网:CVTE(广州视源股份) 团队:CVTE旗下未来教育希沃软件平台中心enow团队 「本文作者:」 前言 本系列共有以下几个章节: 主进程与渲染进程的两情相悦 渲染进程与渲 ...

  5. 毕业设计 : 车牌识别系统实现【全网最详细】 - opencv 卷积神经网络 机器学习 深度学习

    文章目录 0 简介 1 车牌识别原理和流程 1.1 车牌定位 1.2 基于图形图像学的定位方法. 1.3 基于机器学习的定位方法. 1.4 字符分割 1.5 字符识别 2 基于机器学习的车牌识别 2. ...

  6. [转]全网最!详!细!tarjan算法讲解

    转发地址:https://blog.csdn.net/qq_34374664/article/details/77488976 原版的地址好像挂了..... 看到别人总结的很好,自己就偷个懒吧..以下 ...

  7. “是男人就下一百层”h5游戏全网最详细教学、全代码,js操作

    "是男人就下一百层"h5游戏全网最详细教学.全代码,js操作 博主的话 游戏展示 编程工具介绍 游戏代码 代码讲解 js 第一步 切换div的显示与隐藏 js 第二步 在菜单页面用 ...

  8. 全网最详细的深度学习pytorch-gpu环境配置

    学习深度学习第一步就是环境的配置,相信很多小伙伴已经被什么anaconda,tensorflow,Pytorch,cuda这些东西搞得晕头转向,今天带大家详细配置深度学习的环境,这一篇准要教书Pyto ...

  9. 全网超详细的VMware虚拟机安装Kali Linux系统以及首次启动Kali Linux系统的注意事项

    文章目录 1. 简述Kali Linux 2. 下载Kali Linux的镜像文件 3. 安装Kali Linux 4. 首次启动Kali Linux 5. 其他方法安装Kali Linux 1. 简 ...

  10. OpenGauss一主一从搭建(全网最详细,最简单)

    OpenGauss一主一从搭建(全网最详细,最简单) 文章目录 OpenGauss一主一从搭建(全网最详细,最简单) 1.开始搭建: 1.1主机脚本 1.2从机脚本 1.3主库上准备集群参数文件clu ...

最新文章

  1. linux 内核模块加载错误 disagree about version of symbol module_layout
  2. python双向索引什么意思_python字典支持双向索引吗
  3. mongodb mysql json数据_使用MongoDB与MySQL有很多JSON字段?
  4. oracle数据库存储结构语句,oracle基本语句(第五章、数据库逻辑存储结构管理)...
  5. 王道考研 计算机网络6 OSI参考模型和各层作用
  6. get_magic_quotes_gpc()函数用法介绍
  7. 322. 零钱兑换(JavaScript)
  8. 参数化命令相关知识点之==================防止SQl的注入
  9. linux mysql密码相关问题
  10. [JS]视频总结-第一部分_了解JavaScript
  11. c++ 多字节 转换为 unicode
  12. Alias Piping Solutions系列工厂设计软件
  13. geomtry string 转换_SQL Server数据转换【包括Geometry类型】的技巧总结
  14. re管理器修改音量_[教程] 自己手动修改音量键和开机键的功能方法(小更新)
  15. 网易易盾-滑块-cb参数
  16. fuchsia - google 新系统学习(一)
  17. 论文阅读 2021——SUNet: Symmetric Undistortion Network for Rolling Shutter Correction
  18. java注册头像_实现web版用户注册(可以上传头像)
  19. 传统民间游戏于文化消费
  20. CentOS 7 搭建ngrok服务器(外网映射内网)

热门文章

  1. 2021年办专利要多少钱
  2. limit语句的用法
  3. 博捷芯划片机在LED灯珠EMC支架中切割应用
  4. it 脑裂_什么原因会导致脑裂?
  5. 异常监测与应急恢复解决方案
  6. 为复杂混沌的微服务生产环境设计韧性系统
  7. 了解 ArcScene 与 ArcGlobe
  8. HttpEntity的使用 .
  9. CentOS8安装docker-CE版本之镜像加速
  10. 南明离火 - 移动安全分析平台,APK反编译 病毒检测 漏洞挖掘工具使用教程