美文网首页程序员爱编程
Vue: 数字输入框组件

Vue: 数字输入框组件

作者: 一叶扁舟丶 | 来源:发表于2018-10-23 10:57 被阅读55次

    index.html:

    
    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8">
        <title>数字输入框组件</title>
    
    </head>
    <body>
        <div id="app">
            <input-number v-model="value" :max="10" :min="0"></input-number>
        </div>
        <script src="https://unpkg.com/vue/dist/vue.min.js"></script>
        <script src="input-number.js"></script>
        <script src="index.js"></script>
    
    </body>
    </html>
    
    
    

    index.js:

    var app = new Vue ({
        el: '#app',
        data: {
            value: 5
        }
    });
    

    input-number.js:

    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">\
                <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;
                }
            }
        },
        mounted: function () {
            this.updateValue(this.value);
        }
    });
    

    相关文章

      网友评论

      本文标题:Vue: 数字输入框组件

      本文链接:https://www.haomeiwen.com/subject/ivvozftx.html