美文网首页
Vue实战之数字输入框

Vue实战之数字输入框

作者: wenmingxing | 来源:发表于2020-02-16 16:01 被阅读0次
    <!-- 入口页面 -->
    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="utf-8">
            <title>input number</title>
        </head>
    
        <body>
            <div id="app">
                {{value}}
                <input-number v-model="value" :max="100" :min="-100" :step="5"></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>  
    
    // 根实例
    var app = new Vue({
        el: '#app',
        data: {
            value: 0
        }
    });
      
    
    // 数字输入框组件
    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
            },
    
            step: {
                type: Number,
                default: 1
            }
        },
    
        data: function() {
            return {
                currentValue: this.value
            }
        },
    
        watch: {
            currentValue: function(val) {
                this.$emit('input', val);
            },
            //监听value 将新值赋给currentValue
            value: function(val) {
                this.updateValue(val);
            }
        },
    
        methods: {
            updateValue: function(val) {
                if (val > this.max) val = this.max;
                if (val < this.min) val = this.min;
                this.currentValue = val;
            },
    
            handleDown: function() {
                if (this.currentValue <= this.min) return;
                this.currentValue -= this.step;
            },
    
            handleUp: function() {
                if (this.currentValue >= this.max) return;
                this.currentValue += this.step;
            },
    
            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);
        }
    })  
    

    参考

    1. 《Vue.js 实战》

    相关文章

      网友评论

          本文标题:Vue实战之数字输入框

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