一. 场景
两个el-input输入框,只能输入数字,输入文字的时候自动替换清空。需要先填满的金额,才能填减的金额,且减的金额必须小于
满的金额。
<template>
<el-form :model="addForm">
<el-form-item label="满" :label-width="formLabelWidth">
<p style='margin: 0;color:#f09276'>* 必填 </p>
<el-input v-model="addForm.full" onkeyup="value=value.replace(/[^\d]/g,'').replace(/^0(\d+)$/,'$1')" auto-complete="off" placeholder='例:200'></el-input>
</el-form-item>
<el-form-item label="减" :label-width="formLabelWidth">
<p style='margin: 0;color:#f09276'>* 必填 </p>
<el-input v-model="addForm.reduce" onkeyup="value=value.replace(/[^\d]/g,'').replace(/^0(\d+)$/,'$1')" auto-complete="off" @input.native="updateNumber" placeholder='例:10'></el-input>
</el-form-item>
</el-form>
</template>
<script>
export default {
data() {
return {
addForm: {
full: null,
reduce: null
}
}
},
methods: {
updateNumber(){
if(!this.addForm.full) {
this.addForm.reduce = ''
this.$message.error('请先填写优惠券使用金额(满)!')
return
}
// 限定减的金额不能大于满的金额
if(parseInt(this.addForm.reduce) >= parseInt(this.addForm.full)) {
this.addForm.reduce = null
this.$message.error('优惠金额需要小于总金额!')
}
}
}
}
</script>
二. 遇到的问题
☆ 问题:输入框在先输入文字后(随便输入一串文字),再输入数字,数字的值无法同步绑定更新,如下图:
① 在输入框(减)随便输入文字
② vue-devtools调试工具里面
③ 在输入框(减)随便输入数字
④vue-devtools调试工具里面的reduce并没有相应变化,依然为空
因为reduce的值没有实时更新,所有没触发弹窗提醒 “优惠金额需要小于总金额!”
三. 解决办法
3.1 由于数据没有及时更新和改变,于是采用监测输入框(减)的值来进行修改,只改变了methods了里面代码,如下:
methods: {
updateNumber(val){
if(!this.addForm.full) {
this.addForm.reduce = ''
this.$message.error('请先填写优惠券使用金额(满)!')
}
let _this = this
checkNumber(val.data)
function checkNumber(Obj) {
let reg = /^[0-9]+.?[0-9]*$/;
if (!reg.test(Obj)) return _this.addForm.reduce = null
}
// 限定减的金额不能大于满的金额
if(parseInt(this.addForm.reduce) >= parseInt(this.addForm.full)) {
this.addForm.reduce = null
this.$message.error('优惠金额需要小于总金额!')
}
}
}
然后并没有作用,界面的数据并没有实时刷新。于是采用了官网的key方法
3.2 通过给el-input绑定key值,当输入框输入的是文字字符串的时候,在重置输入框绑定的变量为null的同时,也改变绑定的key
值,这样拥有最新数据的el-input就会替换原来的,双向绑定的数据也就实时更新了。
完整代码如下:
<template>
<el-form :model="addForm">
<el-form-item label="满" :label-width="formLabelWidth">
<p style='margin: 0;color:#f09276'>* 必填 </p>
<el-input v-model="addForm.full" onkeyup="value=value.replace(/[^\d]/g,'').replace(/^0(\d+)$/,'$1')" :key="fullKey" auto-complete="off" @input.native="updateFullNumber" placeholder='例:200'></el-input>
</el-form-item>
<el-form-item label="减" :label-width="formLabelWidth">
<p style='margin: 0;color:#f09276'>* 必填 </p>
<el-input v-model="addForm.reduce" onkeyup="value=value.replace(/[^\d]/g,'').replace(/^0(\d+)$/,'$1')" :key="key" auto-complete="off" @input.native="updateNumber" placeholder='例:10'></el-input>
</el-form-item>
</el-form>
</template>
<script>
export default {
data() {
return {
addForm: {
full: null,
reduce: null
},
key: 0,
fullKey: 0
}
},
methods: {
'满'输入框值变化时触发的函数
updateFullNumber(val) {
// 避免'满'输入框,先输入文字后再输入数字,而数字无法及时绑定更新到变量full
let _this = this
checkNumber(val.data)
// 若输入的不是数字
function checkNumber(Obj) {
let reg = /^[0-9]+.?[0-9]*$/;
if (!reg.test(Obj) && val.data != null) {
// 将值置为空
_this.addForm.full = null
// 刷新组件,使界面实时更新
_this.fullKey++
return
}
}
// 限定减的金额不能大于满的金额
if(parseInt(this.addForm.reduce) >= parseInt(this.addForm.full)) {
this.addForm.reduce = null
this.$message.error('优惠金额需要小于总金额!')
}
},
'减'输入框值变化时触发的函数
updateNumber(val){
if(!this.addForm.full) {
this.addForm.reduce = ''
this.$message.error('请先填写优惠券使用金额(满)!')
return
}
// 避免'减'输入框,先输入文字后再输入数字,而数字无法及时绑定更新到变量reduce
let _this = this
checkNumber(val.data)
// 若输入的不是数字
function checkNumber(Obj) {
let reg = /^[0-9]+.?[0-9]*$/;
if (!reg.test(Obj) && val.data != null) {
// 将值置为空
_this.addForm.reduce = null
// 刷新组件,使界面实时更新
_this.key++
return
}
}
// 限定减的金额不能大于满的金额
if(parseInt(this.addForm.reduce) >= parseInt(this.addForm.full)) {
this.addForm.reduce = null
this.$message.error('优惠金额需要小于总金额!')
}
}
}
}
</script>
效果如下:
① 在输入框(减)随便输入文字
② vue-devtools调试工具里面
③ 在输入框(减)随便输入数字
④vue-devtools调试工具里面的reduce同步了变化
以上成功解决了问题(完)。