zoukankan      html  css  js  c++  java
  • vue组件:input数字输入框

    组件效果图如下:

    在vue-cli脚手架上搭建的,用来输入数字,两个按钮用来加减步长。可以设置初始值、最大最小值。

    开始代码:

    父组件---App.vue

    1 <input-component v-model.number='value'
    2 :maxNum='maxNum' 3 :minNum='minNum' 4 :step='step' 5 ></input-component>

    <input-component>该标签是要引用的子组件自定义标签,value为默认输入值,maxNum为最大值,minNum为最小值,step为步长,即点击加/减按钮要增加/减少的数。

    js:

    1 data() {
    2     return {
    3       maxNum: 100,
    4       minNum: 0,
    5       value: 3,
    6       step: 2
    7     }
    8 }

    子组件---input.vue

    1 <input :value="currentVal">
    2 <input type="button" value="+" @click="buttonClick(1)">
    3 <input type="button" value="-" @click="buttonClick(-1)">
    4 <p>默认值:{{value}}</p>
    5 <p>当前值:{{currentVal}}</p>
    6 <p>最大值:{{maxNum}}</p>
    7 <p>步长:{{step}}</p>
     1 export default {
     2         data() {
     3             return {
     4                 currentVal: this.value
     5             }
     6         },
     7         props: {
     8             value: {
     9                 type: Number,
    10                 default: 10
    11             },
    12             maxNum: {
    13                 type: Number,
    14                 default: Infinity
    15             },
    16             minNum: {
    17                 type: Number,
    18                 default: -Infinity
    19             },
    20             step: {
    21                 type: Number,
    22                 default: 1
    23             }
    24         }
    25     }

    vue组件是单向数据流,所以无法从组件内部直接修改prop value的值。可以给组件声明一个data,默认引用value的值,在组件内部维护data,这里声明的data值为currentVal。上面代码第四行。

    以上,解决了初始化引用父组件value的值,如果子组件修改了currentVal,那么父组件里value也要一起更新,使用watch监听

    在子组件中添加

    1 export default {
    2     ... //此处省略了代码
    3      watch: {
    4             currentVal(val){
    5                 console.log('子组件currentVal值改变')
    6                 this.$emit('input', val)
    7             }
    8      }
    9 }

     子组件里按钮点击加减

     1 methods: {
     2       updateVal(val){
     3             if(val > this.maxNum ) val = this.maxNum
     4             if(val < this.minNum) val = this.minNum
     5             this.currentVal = val
     6      },
     7      buttonClick (flag) {
     8            if(flag > 0){
     9                 this.currentVal < this.maxNum ? this.currentVal += this.step : this.maxNum
    10                 this.updateVal(this.currentVal)
    11            }else{
    12                 this.currentVal > this.minNum ? this.currentVal -= this.step : this.minNum
    13                 this.updateVal(this.currentVal)
    14            }
    15      }
    16 }

    @click="buttonClick(1)"中,参数分别传入1和-1,代表加和减,所以方法中通过判断参数flag是否大于0来确定是加按钮还是减按钮,里面用了三元运算符。
    方法updataVal判断输入值是否小于最小值,是否大于最大值,所以,还需要在第一次初始化时调用,及mounted中

    1 mounted(){
    2    this.updateVal(this.value)
    3 }

    看起来OK了,但是,如果你在input框里输入值,在点击加减按钮,它改变的值还是以前的值,所以要在input框上添加change事件

    1 <input :value="currentVal" @change="fixNumber">
    1 methods: {
    2      ...  //省略了其他方法
    3      fixNumber ($event) {
    4           let fix
    5           if (typeof $event.target.value != 'number') {fix = Number($event.target.value.replace(/D/g, ''))}
    6           else {fix = $event.target.value}
    7           this.updateVal(fix)
    8      }
    9 }

    这里第5行代码是判断输入值是否是数字类型并做了一个简单的转换。

    这里获取input输入值,除了可以用$event.target.value,还可以用this.$refs.input.value。

    以上。

  • 相关阅读:
    分解质因数
    大素数测试和分解质因数
    快速幂
    欧拉函数
    素数
    gcd,lcm,ext_gcd,inv
    凸包问题 poj 2187
    map的 简单用法
    判断线段是否在园内
    2-sat 问题
  • 原文地址:https://www.cnblogs.com/ddkei/p/9485927.html
Copyright © 2011-2022 走看看