vue的input中,如何限制只能输入number

本来想用watch观察v-model的值,一旦不是数字,就让新值等于旧值,后来发现不行。h5的type="number"属性在手机上无效。有什么比较好的方法吗

<input v-model="num">

type="tel"的作用是直接弹出数字键盘吧,这样好像也不错

阅读 106.7k
18 个回答

不是推荐用computed么?

        <div id="demo">
            <input v-model="inpNum"/>
            <p>
                {{inpNum}}
            </p>
        </div>
new Vue({
    el:'#demo',
    data:{
        oldNum:0    
    },
    computed:{
        inpNum:{
            get:function(){
                return this.oldNum;
            
            },
            set:function(newValue){
                this.oldNum=newValue.replace(/[^\d]/g,'');
            }
        }
    }
    
})

不过如果你说的是在输入过程中就改。。。那样用户体验未免有点。。。。

<input v-model.number="age" type="number">

看:https://segmentfault.com/a/11...
控制input只能输入数字
<input type="number">在pc和手机端都可以实现只能输入数字,可是手机端弹出的软键盘里面没有完成或者搜索按钮,搜了下,现在的HTML5 number的情况下并没有支持搜索按钮,type='text'是有的。所以曲线救国,控制表单只能输入数字。
起初的想法是先把在

<input type='text' @input="handleInput" :value="val"/>

handleInput(e){
this.val=e.target.value.replace(/[^\d]/g,'');
}

但是这种并不会实时刷新表单的数据,下面就会起作用

e.target.value=e.target.value.replace(/[^\d]/g,'');

优雅点的写法,用自定义指令:

//<input type="text" v-number-only />
 directives: {
        numberOnly: {
            bind: function(el) {
                el.handler = function() {
                    el.value = el.value.replace(/\D+/, '')
                }
                el.addEventListener('input', el.handler)
            },
            unbind: function(el) {
                el.removeEventListener('input', el.handler)
            }
        }
    }
<div id="demo">
    <input 
        type="text"
        placeholder="只能输入正整数"
        @input="change"
        @change="change"
        :value="inpNum"
    />
</div>
new Vue({
    el:'#demo',
    data: {
        oldNum: ''   
    },
    computed: {
        inpNum () {
            return this.oldNum
        }
    },
    methods: {
        change (event) {
            let val = event.target.value.trim()
            // 只能是正整数或空,可根据需求修改正则
            if (/^[1-9]\d*$|^$/.test(val)) {
                this.oldNum = val
            } else {
                event.target.value = this.oldNum
            }
        }
    }
})

https://jsfiddle.net/BarryZha...

如果是在移动端的话,可以这么做:

<input type="text" pattern="[0-9]*">
//<input v-model="num" v-number-only />
Vue.directive('numberOnly', {
    bind: function () {
        this.handler = function () {
            this.el.value = this.el.value.replace(/\D+/, '')
        }.bind(this)
        this.el.addEventListener('input', this.handler)
    },
    unbind: function () {
        this.el.removeEventListener('input', this.handler)
    }
})

封装了一个vue的限制数字的input框,增加了验证,有需要的可以直接拿来用.
链接

  <input  onkeyup="this.value=this.value.replace(/\D/g,'')"/>

手机上我没试过,看过类似文章,http://makaiqian.com/input-be...
其实可以扒扒淘宝类的看看源码。

如果你非要实现只能输入数字,可以试试这个组件 https://github.com/RoamIn/vue...,和使用原生的 input 基本没什么区别,直接上 v-model
这个组件有个缺点就是,如果你需要数字,需要注意最大值,因为不支持科学计数法,所以有效精度为 15 位,16就有可能超出最大浮点数范围了

watch: {

'phoneNumber': function (curVal, oldVal) {
  if (!curVal) {
    this.phoneNumber = ''
    return false
  }
  this.phoneNumber = curVal.match(/\d/ig) ? curVal.match(/\d/ig).join('') : ''
}

}

<input type="text" :value="num" @input="numberOnly(num, $event)" />
numberOnly:function (e, item) {
    item = e.target.value.replace(/[^\d]/g,'')
    e.target.value = item
}

或者偷懒

<input type="text" :value="num" @input="num = $event.target.value.replace(/[^\d]/g,'');$event.target.value = num" />

在 input 元素的 @input 或者 @change 事件上绑定该函数即可

verifyInt(){
    e.target.value = e.target.value.replace(/[^\d]/g, ''); //只允许输入正整数
    if (e.target.value == '0') { //不允许输入0
        e.target.value = null;
    } else {
        e.target.value = e.target.value.replace(/^[0]+[0-9]*$/gi, '') //         replace(/^[0]+[0-9]*$/gi, "")是数字前面不能有0
    }
}
新手上路,请多包涵
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
1 篇内容引用
推荐问题
宣传栏