vue.js实现只能输入数字的输入框


Posted in Javascript onOctober 19, 2019

在菜鸟教程里,看了vue.js的教程,看完后,练练手,就试着实现了只能输入数字的输入框。在之前的博客里,用jquery也实现了这样的功能,这里用vue.js来实现,把实现的过程记录下来

如果只是一个输入框,要实现就非常的简单了,输入框的内容和数据绑定,给数据加一个监听器就可以了,代码如下:

<!DOCTYPE html>
<html>
<head>
 <meta charset="utf-8">
 <title>Vue</title>
 <script src="https://cdn.staticfile.org/vue/2.4.2/vue.min.js"></script>
</head>
<body>
 <div id="div1">
 <input v-model="content">
 </div>
 <script>
 var mydata = new Vue({
 el: '#div1',
 data: {
 content: ''
 },
 watch: {
 content: function(val){
  this.content = val.replace(/\D/g, '')
 }
 }
 })
 </script>
</body>
</html>

如果页面或是系统里有很多这样的输入框,这样做,就不是很好了。每个数据都加一个监听器,然后某一天突然需求改了,可以输入数字和字母了,那就要改得吐血了!而且这样做,代码也没有可移植性,到了另一个系统里,还得重写一遍,所以,就要写一个通用的方法来实现这个需求。这个时候就要用到组件的功能,先新建一个js文件,我这里就叫num.js。然后num.js里面的代码:

Vue.component('number', {
 template: '<input type="text" v-model="con">',
 data: function(){
 return {
 con: ''
 }
 },
 watch: {
 con: function(val){
 this.con = val.replace(/\D/g, '');
 }
 }
})

这样就定义了一个组件number,组件里是一个输入框,输入框的内容与数据con绑定,监听器控制con只能是数字。然后在html页面里引入num.js,在页面添加<number></number>标签,在浏览器里,看到的就是一个输入框,但是输入框只能输入数字。在页面放置输入框,是为了让用户输入内容,输入的内容是要给程序用的。那要怎么获取输入框的内容?如果是用jquery的话,那就是通过dom来获取,但vue的设计理念是dom和数据分离,通过dom来获取就不合适,所以就要让输入框与一个数据绑定起来。

vue.js实现只能输入数字的输入框

现在页面有三个输入框,三个输入框的内容要分别绑定到val1、val2、val3。该怎么弄?一开始,我的做法是在number标签上定义一个方法,组件里con的监听器监听到con值有改变时,就调用这个方法,把con的值传出来,而这个方法又会调用mydata里的一个方法,两次传递,把值传给对应的val。这逻辑,听着是不是感觉很绕。很绕都不怕,重要的是,别人用起来很不方便,需要自己到mydata里定义一个方法来赋值。所以后来就再改,输入框的内容不是要绑定一个数据吗?那要绑定到哪个数据,得告诉我吧,所以在number标签上,需要告诉我对象是哪个,属性名是哪个,这样,我就可以把输入框的内容绑定到这个对象的这个属性上。在这里,对象就是mydata,属性名就是val1、val2、val3。把对象传进去,传的是字符串mydata,并不是一个对象,在组件里面,要怎么使用mydata这个对象?这个时候,就需要用到js里非常强大的一个函数eval,eval函数接收一个字符串参数,只能是字符串,然后函数会把这个字符串当作js代码来解析并执行。代码

<!DOCTYPE html>
<html>
 <head>
 <meta charset="utf-8">
 <title>vue</title>
 <script src="https://cdn.staticfile.org/vue/2.4.2/vue.min.js"></script>
 <script src="num.js"></script>
 </head>
 <body>
 <div id="div1">
 <number objname="mydata" keys="val1"></number>
 <number objname="mydata" keys="val2"></number>
 <number objname="mydata" keys="val3"></number>
 <p>第一个输入框的内容是: {{val1}}</p>
 <p>第二个输入框的内容是: {{val2}}</p>
 <p>第三个输入框的内容是: {{val3}}</p>
 </div>
 
 <script>
 var mydata = new Vue({
 el: '#div1',
 data: {
  val1: '',
  val2: '',
  val3: ''
 }
 })
 </script>
 </body>
</html>

num.js的代码:

Vue.component('number', {
 props: ['objname', 'keys'],
 template: '<input type="text" v-model="con">',
 data: function(){
 return {
 con: ''
 }
 },
 watch: {
 con: function(val){
 this.con = val.replace(/\D/g, '');
 eval(this.objname+'[this.keys]=this.con');
 }
 },
})

运行效果图:

vue.js实现只能输入数字的输入框

这样,输入框限制了只能输入数字,也和数据绑字了,但这只是单向的绑字,输入框的内容改变了,外面的数据会跟着改变,但外面的数据改变了,输入框的内容不会跟着改变,所以,现在只是单向的绑定。在页面下面再添加三个普通的输入框,三个输入框分别绑定val1、val2、val3

vue.js实现只能输入数字的输入框

这个时候到页面上操作就会发现,上面的输入框内容改变会影响下面的,但下面的输入框内容改变了,就不会影响上面的输入框的内容

vue.js实现只能输入数字的输入框

这个时候,要实现反向的绑定,那就需要在组件里为外面的数据添加监听器。有对象,有属性名,为它加监听器,是可以加的,但是外面的属性要绑定哪个组件里的输入框呢?所以组件上要再添加一个属性ref,这个ref是vue定义的一个属性,用来找子组件的。这样,代码最终就变成

<div id="div1">
 <number ref="val1" objname="mydata" keys="val1"></number>
 <number ref="val2" objname="mydata" keys="val2"></number>
 <number ref="val3" objname="mydata" keys="val3"></number>
 <p>第一个输入框的内容是: {{val1}}</p>
 <p>第二个输入框的内容是: {{val2}}</p>
 <p>第三个输入框的内容是: {{val3}}</p>
 <input v-model="val1">
 <input v-model="val2">
 <input v-model="val3">
 </div>

num.js里面

Vue.component('number', {
 props: ['objname', 'keys'],
 template: '<input type="text" v-model="con">',
 data: function(){
 return {
 con: ''
 }
 },
 mounted: function(){
 var self = this;
 window.addEventListener('load', function(){
 eval(self.objname+'.$watch(\''+self.keys+'\',function(val){this.$refs.'+self.keys+'.con=val})');
 })
 },
 watch: {
 con: function(val){
 this.con = val.replace(/\D/g, '');
 eval(this.objname+'[this.keys]=this.con');
 }
 },
})

这样,数据就实现了双向绑定。在mounted里面,addEventListener方法是有兼容问题的,IE8及以下版本没有这个方法,我这里没有做兼容处理。然后就是优化,看代码就发现,在number标签上,ref和keys实际上是一样的,可不可以只用一个?经过实验,在组件内部获取ref的值获取不到,这个我还不知道怎么获取,学得不够深呐。然后就是objname可不可以不传,不传的话就默认是组件的父对象,这个是可以实现的。最后,组件还可以进行一些扩展,比如再添加一个属性mytype,mytype不传则默认输入框只能输入数字,如果为word,则输入框只能输入字母和数字,如果为chinses,则只能输入中文汉字等。

更多教程点击《Vue.js前端组件学习教程》,欢迎大家学习阅读。

关于vue.js组件的教程,请大家点击专题vue.js组件学习教程进行学习。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js实现DIV的一些简单控制
Jun 04 Javascript
JS实现金额转换(将输入的阿拉伯数字)转换成中文的实现代码
Sep 30 Javascript
jquery控制display属性为none或block
Mar 31 Javascript
JS常用表单验证方法总结
May 22 Javascript
js跨域问题浅析及解决方法优缺点对比
Nov 08 Javascript
js进行表单验证实例分析
Feb 10 Javascript
Canvas实现动态的雪花效果
Feb 13 Javascript
jQuery实现单击按钮遮罩弹出对话框效果(1)
Feb 20 Javascript
angular基于ng-alain定义自己的select组件示例
Feb 23 Javascript
对于防止按钮重复点击的尝试详解
Apr 22 Javascript
微信小程序实现下拉加载更多商品
Dec 29 Javascript
详解Js模块化的作用原理和方案
Apr 29 Javascript
Vue数字输入框组件的使用方法
Oct 19 #Javascript
微信小程序实现禁止分享代码实例
Oct 19 #Javascript
Vue.js组件props数据验证实现详解
Oct 19 #Javascript
Vue.js组件使用props传递数据的方法
Oct 19 #Javascript
Vue.js数字输入框组件使用方法详解
Oct 19 #Javascript
JavaScript闭包相关知识解析
Oct 19 #Javascript
Vue.js组件通信之自定义事件详解
Oct 19 #Javascript
You might like
使用adodb lite解决问题
2006/12/31 PHP
php防止sql注入示例分析和几种常见攻击正则表达式
2014/01/12 PHP
ThinkPHP 模板substr的截取字符串函数详解
2017/01/09 PHP
PHP在同一域名下两个不同的项目做独立登录机制详解
2017/09/22 PHP
ThinkPHP5.0框架实现切换数据库的方法分析
2019/10/30 PHP
如何判断图片地址是否失效
2007/02/02 Javascript
Javascript 八进制转义字符(8进制)
2011/04/08 Javascript
js获取html参数及向swf传递参数应用介绍
2013/02/18 Javascript
js输入框邮箱自动提示功能代码实现
2013/12/10 Javascript
什么是cookie?js手动创建和存储cookie
2014/05/27 Javascript
angularjs实现与服务器交互分享
2014/06/24 Javascript
Boostrap模态窗口的学习小结
2016/03/28 Javascript
IE8 内存泄露(内存一直增长 )的原因及解决办法
2016/04/06 Javascript
Bootstrap富文本组件wysiwyg数据保存到mysql的方法
2016/05/09 Javascript
AngularJS入门教程之表单校验用法示例
2016/11/02 Javascript
自己封装的一个简单的倒计时功能实例
2016/11/23 Javascript
npm国内镜像 安装失败的几种解决方案
2017/06/04 Javascript
bootstrap基本配置_动力节点Java学院整理
2017/07/14 Javascript
vue 运用mock数据的示例代码
2017/11/07 Javascript
使用webpack搭建react开发环境的方法
2018/05/15 Javascript
python 获取文件列表(或是目录例表)
2009/03/25 Python
使用BeautifulSoup爬虫程序获取百度搜索结果的标题和url示例
2014/01/19 Python
python的paramiko模块实现远程控制和传输示例
2017/10/13 Python
Django CBV与FBV原理及实例详解
2019/08/12 Python
Python使用APScheduler实现定时任务过程解析
2019/09/11 Python
Python内置函数locals和globals对比
2020/04/28 Python
欧洲最古老的鞋厂:Peter Kaiser
2019/11/05 全球购物
什么是"引用"?申明和使用"引用"要注意哪些问题?
2016/03/03 面试题
工作决心书范文
2014/03/11 职场文书
八一建军节演讲稿
2014/09/10 职场文书
检讨书范文2000字
2015/01/28 职场文书
部门经理迟到检讨书
2015/02/16 职场文书
幼儿园师德师风心得体会
2016/01/12 职场文书
2016大学生暑期社会实践心得体会
2016/01/14 职场文书
浅谈mysql返回Boolean类型的几种情况
2021/06/04 MySQL
Vue3.0 手写放大镜效果
2021/07/25 Vue.js