element input 比较大小值相互校验导致死循环

问题背景

使用elementui input 校验大小值时,min > max 导致min出现红框,修改最大值,使得最小值小于最大值后,前面的最小值输入框,由于没有选中输入,依然展示红色提示,预期最大值修改后联动。

在 rules 的 validateOutputMinAndMax 中写这部分逻辑,导致一直重复校验而出现死循环,比如

const tableRules = ref({
  min: [
    { validator: validateOutputMinAndMax, trigger: ['change'] }
  ],
  max: [
    { validator: validateOutputMinAndMax, trigger: ['change'] }
  ]
})


const validateOutputMinAndMax = (rule: any, value: any, callback: any) => {
  let index = rule.field.split('.')[0];
  let field = rule.field.split('.')[1];
  let rowMinValue = tableData.value[index].min;
  let rowMaxValue = tableData.value[index].max;


  const isEmpty = (value) => {
    return value === null || value === '';
  }

  // 不能同时为空
  if (isEmpty(rowMinValue) && isEmpty(rowMaxValue)) {
    callback({
      type: 'error',
      msg: t('minAndMaxCannotBeEmpty')
    });
    return;
  }

  if (!isEmpty(value) && !isNumeric(value + '')) {
    callback({
      type: 'error',
      msg: t('pleaseInputNumber')
    });
    return;
  }

  // 最小值不能大于最大值
  if (rowMinValue !== null && rowMinValue !== '' && rowMaxValue !== '' && rowMaxValue !== null && Number(rowMinValue) >= Number(rowMaxValue)) {
    callback({
      type: 'error',
      msg: t('minValueShouldBeLessThanMax')
    });
    return;
  }

  callback();

  if (field === 'min') {
      tableRuleFormRef.value.validateField(`${index}.max`, () => {});
    }

if (field === 'max') {
      tableRuleFormRef.value.validateField(`${index}.min`, () => {});
    }
}

  解决办法

input 元素上使用 @input="validateMinOrMax(scope.$index, 'max')"

const validateMinOrMax = (index, field) => {
  tableRuleFormRef.value.validateField(`${index}.${field}`);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值