美文网首页
常用组件开发:数字输入框

常用组件开发:数字输入框

作者: 水母云 | 来源:发表于2019-01-18 16:24 被阅读0次

开发一个数字输入框组件
数字输入框是对普通输入框的扩展,用来快捷键入一个标准的数字。

数字输入框
业务需求:数字输入框只能输入数字,而且有两个快捷按钮,可以直接减1或加1。除此之外,还可以设置初始值、最大值、最小值,在数值改变时,触发一个自定义事件来通知父组件。
了解需求以后,定义目录文件:
  • index.html 入口页
  • input-number.js 数字输入框组件
  • index.js 根实例
    index.html:
 <!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>数字输入框组件</title>
</head>
<body>
    <script src="https://unpkg.com/vue/dist/vue.min.js"></script>
    <div id="app">
        <input-number v-model="value" :max="10" :min="0"></input-number>
    </div>
    <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
        }
    },
    // Vue组件是单向数据流,所以无法从组件内部直接修改prop value的值。
    // 解决办法:给组件声明一个data,默认引用value的值,然后在组件内部维护这个data。
    // 完成了初始化时引用父组件value
    data: function() {
        return {
            currentValue: this.value
        }
    },
    // 监听(watch)选项用来监听某个prop或data的改变,当它们发生变化时,就会触发watch配置的函数。
    // 我们需要监听两个量:value和currentValue。
    // 监听value是要知晓从父组件修改了value。
    // 监听currentValue是为了当currentValue改变时,更新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钩子里也调用了updateValue()方法。是因为第一次初始化时,也对value进行了过滤。
    mouted: function() {
        this.updateValue(this.value);
    }
});

相关文章

网友评论

      本文标题:常用组件开发:数字输入框

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