• Vue(八) 数字输入框组件案例


    数字输入框是对普通输入框的扩展,用来快捷输入一个标准的数字,如图:

    代码:

     <div id="app">
            <input-number v-model="value" :max="100" :min="0"></input-number>
        </div>
        <script>
            function isValueNumber (value) {
                return (/(^-?[0-9]+.{1}d+$)|(^-?[1-9][0-9]*$)|(^-?0{1}$)/).test(value + '');
            }
    
             Vue.component('input-number', {
                template: '
                    <div class="input-number">
                        <input 
                            type="text"
                            :value="currentValue"
                            @change="handleChange"
                            @keyup.up="handleUp"
                            @keyup.down="handleDown">
                        <button 
                            @click="handleDown" 
                            :disabled="currentValue <= min">-</button> 
                        <button 
                            @click="handleUp" 
                            :disabled="currentValue >= max">+</button> 
                        </div>',
                props: {
                    max: {
                        type: Number,
                        default: Infinity
                    },
                    min: {
                        type: Number,
                        default: -Infinity
                    },
                    value: {
                        type: Number,
                        default: 0
                    }
                },
                data: function() {
                    return {
                        currentValue: this.value
                    }
                },
                watch: {
                    currentValue: function (val) {
                        this.$emit('input', val);
                        this.$emit('on-change', val);
                    },
                    value: function (val) {
                        this.updateValue (val);
                    }
                },
                methods: {
                    handleDown: function () {
                        if(this.currentValue <= this.min) return;
                        this.currentValue -= 1;
                    },
                    handleUp: function () {
                        if(this.currentValue >= this.max) return;
                        this.currentValue += 1;
                    },
                    updateValue: function (val) {
                        if(val > this.max) val = this.max;
                        if(val < this.min) val = this.min;
                        this.currentValue = val;
                    },
                    handleChange: function (event) {
                        var val = event.target.value.trim();
                        var max = this.max;
                        var min = this.min;
                        if(isValueNumber(val)) {
                            val = Number(val);
                            this.currentValue = val;
                            if(val > max) {
                                this.currentValue = max;
                            } else if(val < min) {
                                this.currentValue = min;
                            }
                        } else {
                                event.target.value = this.currentValue;
                        }
                    }
                },
                mounte: function () {
                    this.updateValue(this.value);
                },
            });
    
            var app = new Vue({
                el: '#app',
                data: {
                    value: 5
                }
            })
        </script>
    
    作者:kindleheart
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    中国剩余定理(crt)和扩展中国剩余定理(excrt)
    数论集合
    gcd(欧几里得算法)与exgcd(扩展欧几里得算法)
    青蛙的约会
    【杭电多校第七场】A + B = C
    【XDOJ】小W的塔防
    备战省赛组队训练赛第十四场(UPC)
    2019.4.27浙江省赛
    备战省赛组队训练赛第六场(UPC)
    备战省赛组队训练赛第七场(UPC)
  • 原文地址:https://www.cnblogs.com/kindleheart/p/10006179.html
Copyright © 2020-2023  润新知