效果:想要实现输入框只能输入数字,第一位不能是点,小数点后只有两位数字等等
问题:在input事件中正则匹配修改,处理完数据之后赋值给v-model绑定的值,但是仍然失效,通过日志打印数值发现已经修改成功,所以问题出在没有实时修改上
解决:
<input type="digit" v-model="inputParValue" @input="inputValue"/>
//购买弹窗内的输入面值
inputValue(e) {
let value = setValue(e.detail.value)
this.$nextTick(() => {
this.inputParValue = value;
})
加一个$nextTick()函数进行实时监听修改,就解决了,或者使用setTimeOut函数重复调用赋值应该也ok
原因:
- 我们将赋值操作放到nextTick或者setTimeout中时,他们会在当前视图更新完成后执行里面的回调,所以在v-model改变数据为0.251581111后,视图会先去更新一遍,此时值为0.251581111。
- 然后在nextTick中,对inputParValue重新赋值为正则处理过的数值,会再向任务队列里添加一个更新任务,此时取到的原始值就是0.251581111,新的值为处理后的值0.25,所以会触发视图的更新操作,于是完成了视图的更新
最后贴上正则处理函数
function setValue(e) {
return e
.replace(/^0+/,'0') //限制连续只能输入1个0
.replace(/[^\d.]/g, "") //清除“数字”和“.”以外的字符
.replace(/^\./g, "") //首位不能输入“.”
.replace(/\.{2,}/g, ".") //只保留第一个. 清除多余的
.replace(".", "$#$")
.replace(/\./g, "")
.replace("$#$", ".")
.replace(/^(\-)*(\d+)\.(\d\d).*$/, "$1$2.$3"); //保留两位小数
//.replace(/^(\-)*(\d+)\.(\d\d\d).*$/, "$1$2.$3"); 保留3位小数,以此类推
}