el-input无法实时获取当前输入值的原因之一及解决办法

一. 场景

两个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同步了变化
在这里插入图片描述
以上成功解决了问题(完)。

讨论数量: 0

慎思笃行