当前位置: 首页 > news >正文

VUE2 学习笔记7 v-model、过滤器

v-model

v-model收集表单数据

对于vue中的表单,在实际使用时,虽然表单上有action属性,但是一般vue的表单并不通过action把表单提交到某个地址。一般是点击提交时绑定事件,在事件内部处理数据并向服务器发起请求。

先写一个比较简单的表单:

<body><div id="root"><form>username:<input type="text"><br/>password:<input type="password"><br/>sex:<input type="radio">male <input type="radio">female<br/>hobby:<input type="checkbox">read<input type="checkbox">walk<input type="checkbox">sleep<br/>address:<select><option value="beijing">beijing</option><option value="shanghai"> shanghai</option></select><br/>otherInformation:<textarea rows="5"></textarea><br/>agree:<input type="checkbox">agreement protocol<br/><button>submit</button></form></div><script type="text/javascript" src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script><script>const vm = new Vue({el:"#root",            data(){return {userInformation:{account:'',password:'',sex:'',hobby:[],information:'',agree:false,address:'',}}},})</script>
</body>

v-model如何收集单选框的数据:

对于单选框中的数据,并不能单纯通过v-model绑定对应变量来实现。

因为v-model默认收集value值,但单选框radio并没有value值。这时需要手动为单选框设置value属性,value属性的值就是希望v-model收集到的数据。

v-model如何收集多选框的数据:

对于多选框,同样不能单纯绑定v-model。

因为在vue中,多选框checkbox他的value值默认读取的是checkbox的checked值,当多选框被勾选,checked为true,因此直接绑定v-model,当勾选多选框,v-model会变成true。不勾选时会变成false。

对于一组多选框,如果给一组多选框中的每一个都绑定了v-model,且v-model绑定的变量一样,因为v-model是双向数据绑定,勾选一个多选框,会把对应的checked都修改为true,因此整组多选框都会被勾选。

在没配置value的情况下,如果checkbox v-model绑定的变量是数组,则无法正确获取value:

处理方法:给checkbox赋上value。

但仅有value还不够,v-model绑定的变量初始值还必须是一个数组。如果不是数组,配置的value值会失效,因为v-model绑定变量的类型会影响数据的收集。

但对于只有一个选项的checkbox,是可以通过直接绑定v-model来获取的,这时v-model绑定的变量应该是字符串或者布尔值。

v-model如何收集下拉框/textarea/input-password/input-text数据:

下拉框select的option本身就需要配置value,因此收集select数据时,在select标签上绑定v-model就可以了。

对于textarea、input type="password"、input type="text"也具有value,因此直接在标签上绑定v-model即可。

提交

当点击表单上的按钮时,会触发表单的提交事件,也就是form上的submit事件,表单提交时会刷新页面,当不希望页面刷新时,可以给绑定的事件设置修饰符,阻止默认事件。

在submit绑定事件中,可以把从表单上收集到的数据进行处理,并传输给服务器。

点击submit:

完整代码:

<body><div id="root"><form @submit.prevent="submitUserInformation">username:<input type="text" v-model="userInformation.account"><br/>password:<input type="password" v-model="userInformation.password"><br/>sex:<input type="radio" name="sex" value="male" v-model="userInformation.sex">male <input type="radio" name="sex" value="female" v-model="userInformation.sex">female<br/>hobby:<input type="checkbox" name="hobby" v-model="userInformation.hobby" value="read">read<input type="checkbox" name="hobby" v-model="userInformation.hobby" value="walk">walk<input type="checkbox" name="hobby" v-model="userInformation.hobby" value="sleep">sleep<br/><br/>address:<select v-model="userInformation.address"><option value="beijing">beijing</option><option value="shanghai"> shanghai</option></select><br/>otherInformation:<textarea rows="5" v-model="userInformation.information"></textarea><br/>agree:<input type="checkbox" v-model="userInformation.agree">agreement protocol<br/><button>submit</button></form></div><script type="text/javascript" src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script><script>const vm = new Vue({el:"#root",data(){return {userInformation:{account:'',password:'',sex:'',hobby:[],information:'',agree:false,address:'',}}},methods:{submitUserInformation(){console.log(this.userInformation);console.log('处理数据,想服务器发送数据等...');}},        })</script>
</body>

v-model修饰符

v-model上也是有修饰符的。

对于一个输入框,并不能预测用户的输入是完全合法的,当前也可以通过input框的type来限制用户输入,但对于收集到的数据,有时也需要进行一些处理。可以使用v-model修饰符来对收集到的数据进行处理。

number修饰符

如果输入的内容不是数字,则v-model不会收集非数字部分。

v-model.number只采集输入框内的数字。

但在实际开发中,v-model.number会有很多令人疑惑的表现,v-model.number也和绑定数据的初始值相关,当绑定的数据是字符串时,v-model.number可能不会生效,这就导致可以输入字符串,而且,即使v-model.number生效,在输入框输入字符串时,后台不会收集字符串,所以当把焦点移开时,输入框上的字符串会突然消失,造成很不好的交互体验。

最好把v-model和type="number"一起使用。

lazy修饰符

对于一个输入框,默认行为是当输入的内容发生变化时,马上就进行数据的双向响应,但有时候并不希望每敲一个或者每删除一个字符都触发一次数据的变化。有时候希望当输入内容都输入完成后才进行一次数据收集,这种效果可以用lazy修饰符来实现。

但lazy也并不是当前输入框停止输入后马上收集数据,lazy是在当前输入框失去焦点后收集数据。

当焦点还在area框上的时候,不会收集数据。

把焦点移走之后,才收集一次数据。

trim修饰符

去掉数据前后的空格。但无法去掉数据中间的空格。

过滤器

过滤器是Vue提供的一种新的计算方法,用在代码中,可以让数据格式的处理更加优雅。

思考下面这种场景,如果页面上需要显示一个时间,用代码获取的时间,需要对时间经过一系列处理,让时间返回一个易读的格式。

一种实现方式,是把处理函数封装在methods或者computed中。当然也可以使用别人封装好的计算方法,可以使用bootCDN等网站提供的方法。

除此之外,Vue又提供了一种新方法,也可以用过滤器实现。

过滤器使用 过滤对象 | 过滤方法 来调用。其中 | 叫管道符。

过滤器使用 filters:{} 来配置,在filters内部,每个过滤器都是一个函数。

在 过滤对象 | 过滤方法 中,Vue在进行解析时,会把过滤对象作为过滤方法的参数,然后调用过滤方法,并把返回值放回原处。

<body><div id="root"><h2> {{ time | getNowData}} </h2></div><script type="text/javascript" src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script><script>const vm = new Vue({el:"#root",data(){return {time: new Date(),}},filters:{getNowData(time){return `${time.getMonth()+1}-${time.getDate()}-${time.getHours()}`;}}})</script>
</body>

过滤器也可以传参数,当不传参数时,默认只传递要过滤的对象,当传递了参数时,过滤器获得的参数是过滤对象以及后添加的参数。

当过滤器需要返回多种格式时,可以使用传参的方法控制,当传递特定参数时,返回某种格式的数据,不传递时,返回另一种格式。

多个过滤器之间可以串联,当过滤器串联时,把前一个过滤器返回的结果作为参数赋给后一个过滤器。

如果过滤器只定义在某个组件(一个组件就是微型的vm)或者vm实例上,此时定义的filter都是局部过滤器,只有当前的组件和当前vm实例可以使用。如果多个组件都需要使用同一个过滤器,则可以配置全局过滤器。

全局过滤器通过Vue.filter( 过滤器名字(字符串格式),过滤器函数 ) 来对过滤器进行注册。要注意filter过滤器只能一个一个过滤器注册。

        Vue.filter('getNowData',function(time,data=''){return `${time.getMonth()+1}-${time.getDate()}-${time.getHours()} ${data}`;})

过滤器可以使用在插值语法中,或者使用在v-指定动态绑定数据时。但并不是所有v-指令都能使用过滤器,在v-model中,就不能使用filter语法。

 

http://www.lryc.cn/news/600788.html

相关文章:

  • 6.数组和字符串
  • ChatIm项目文件上传与获取
  • 拉普拉斯方程的径向解法
  • opencv学习(图像金字塔)
  • DriverManager在rt.jar里,凭什么能加载到classpath下的驱动?
  • Vue当中背景图无法占满屏幕的解决方法
  • 记一次腾讯云临时密钥接管存储桶
  • 零基础 “入坑” Java--- 十四、【练习】图书小系统
  • mrpc框架项目的AI总结
  • 热传导问题Matlab有限元编程 :工业级热仿真核心技术-搭建热传导求解器【含案例源码】
  • 【ELasticsearch】节点角色分类与作用解析
  • ubuntu下docker安装thingsboard物联网平台详细记录(附每张图)
  • 考研复习-数据结构-第八章-排序
  • 求hom_math_2d的角度值
  • URL与URI:互联网世界的“门牌号“与“身份证“
  • DocC的简单使用
  • ICMP报文工作原理
  • Linux如何执行系统调用及高效执行系统调用:深入浅出的解析
  • Python 数据分析(二):Matplotlib 绘图
  • 斐波那契数列加强版 快速矩阵幂
  • 特产|基于SSM+vue的南阳特产销售平台(源码+数据库+文档)
  • Linux 系统调用详解:操作文件的常用系统调用
  • SSE (Server-Sent Events) 服务出现连接卡在 pending 状态的原因
  • 2025微前端架构研究与实践方案
  • JavaScript里的string
  • 前端设计中如何在鼠标悬浮时同步修改块内样式
  • 【机器学习深度学习】LLamaFactory微调效果与vllm部署效果不一致如何解决
  • k8s的nodeport和ingress
  • 什么是JUC
  • Voxtral Mini:语音转文本工具,支持超长音频,多国语音