将数字作为初始值存储在formik、react final形式、react hook形式中



我想知道人们对这个场景的看法:你有一个代表商品价格的输入,比如为用户购买的商品填写表格。你有一些实用程序可以让数字有一定数量的小数,而不是负数,等等。当然,输入中的值本身需要是一个字符串,因为它在一天结束时是html。两种选择的优点/缺点是什么:

  • 编写一些代码,接受数字类型的初始值,将数字格式化为字符串表示,然后解析回数字表示,这两件事都可以处理从美分到美元的潜在转换,等等。或
  • 将初始值格式化为字符串,并继续处理字符串值,然后在提交给api时,将其解析为api所需的值(在本例中,值以美分为单位(

我觉得这两种方法都有折衷,但将事物保持为字符串总是更解耦的,这在提交、验证(例如,检查值是否大于0,必须在验证前转换为数字(等地方附带了一些额外的代码,但在表单级别保持简单。

另一方面,如果你的应用程序中有很多地方都有价格输入字段,那么将数字保持为表单状态中的值可能更有意义,并且可以将表单状态提交给api,而不用担心它是正确的类型/值,这听起来既好又方便。

在一天结束时,DOM输入使用字符串。请记住,历史上表单数据是作为查询参数提交的。

React Final Form从第一天起就有parseformat道具,但根据我的经验,我建议不要使用它们。我的建议是:保留表单值字符串,如果必须的话,在提交时将它们解析为Number

默认情况下输入返回字符串。您可以参考以下规范:

https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement

但是,您可以使用valueAsNumber,但需要小心使用NaN。当解析失败时,它将返回到那个状态。

valueAsNumber

double:返回元素的值,按顺序解释为以下值之一:

  • 时间值
  • 一个数字
  • NaN(如果无法转换(

这里是react-hook-form中的一个实现,您也可以像Erik(React Final Form和Redux Form的作者(上面建议的那样进行解析。

<input type="number" name="number" ref={register({ valueAsNumber: true, min: 4 })} />

您ping到的所有libs都支持以某种方式解析为数字。

最新更新