当前位置 主页 > 网站技术 > 代码类 >

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

    栏目:代码类 时间:2019-10-19 12:07

    在菜鸟教程里,看了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 >
     <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来获取就不合适,所以就要让输入框与一个数据绑定起来。

    现在页面有三个输入框,三个输入框的内容要分别绑定到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 >
      <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>