微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

React-Number-Format 将值作为浮点数传递给验证

如何解决React-Number-Format 将值作为浮点数传递给验证

我有一个 react-hook-form 表单和验证。我想要做的是使用 react-number-format 格式化输入,同时将浮点值传递给验证并提交。

这是代码和框: https://codesandbox.io/s/keen-field-26ub7

在 InvoiceData.js 中有一个 react-number-format 正在使用的输入。我想根据上面的值 (grossValue) 验证此输入,但我认为如果不解析该值以再次浮动,我就无法做到这一点。

解决方法

第一个解决方案

NumberFormat 内部创建一个 InvoiceData 类并使用相同的格式化道具,以检索其 removeFormatting 函数

InvoiceData.js

const getProperties = ({ invoice,register,errors }) => ({
  customInput: TextField,inputRef: register,variant: "outlined",name: "amountToPay",label: "InvoiceData.amountToPay",helperText: ((errors || {}).amountToPay || {}).message,error: (errors || {}).amountToPay,thousandSeparator: " ",suffix: " PLN",defaultValue: (invoice || {}).amountToPay,decimalScale: 2,fixedDecimalScale: true
});

export const removeFormatting = (value,props = {}) => {
  const properties = getProperties(props);
  let res = Number.parseFloat(
    new NumberFormat(properties).removeFormatting(value)
  );
  if (properties.decimalScale) {
    return res * Math.pow(10,-properties.decimalScale);
  }
  return res;
};

然后您可以使用该函数来检查您提交的表单是否有效:

Form.js

const onSubmit = async (data) => {
  if (removeFormatting(data.amountToPay) === responseData.amountGross) {
    // action when valid
    console.log("valid");
  } else {
    // action when invalid
  }
};

使用此链接查看修改后的代码: https://codesandbox.io/s/heuristic-paper-4ycuh

第二种解决方案

使用状态来记住 amountToPay 如下:

const [amountToPay,setAmountToPay] = useState(responseData.amountToPay)

向您的 InvoiceData 组件添加回调函数并使用 onValueChange 中的 NumberFormat 调用该函数,例如:

const InvoiceData = ({...props,handleChanged} => {

  return (
    <NumberFormat
      // whatever props you need
      onValueChange={(value) => handleChanged(value.floatValue)}
    />
  );

}

然后您可以传递我们之前定义的 setAmountToPay,并以这种方式将其传递给 InvoiceData

<InvoiceData
  // whatever props you need
  handleChanged={setAmountToPay}
/>

然后您可以按照以下方式验证您的提交

const onSubmit = async () => {
  if (amountToPay === responseData.amountGross) {
    // action when valid
    console.log("valid");
  } else {
    // action when invalid
  }
};
,

我想我已经找到了建立在 Alexandre ELIOT 在第二个解决方案中所做的基础之上的答案。 我没有将 amountToPay 传递给 onSubmit 函数,而是将它传递给 NumberFormat 本身。

<NumberFormat
        customInput={TextField}
        inputRef={register}
        variant="outlined"
        name="amountToPay"
        label={t('InvoiceData.amountToPay')}
        helperText={
          /* eslint-disable-next-line */
          amountToPay> invoice.amountGross
            ? 'cannot be greater that amount gross'
            : amountToPay=== 0
            ? 'cannot be 0'
            : null
        }
        error={amountToPay> invoice.amountGross || amountToPay=== 0}
        thousandSeparator={' '}
        suffix=" PLN"
        defaultValue={invoice.amountToPay}
        onValueChange={(value) => handleValueChange(value.floatValue)}
        decimalScale={2}
        fixedDecimalScale
      />

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?