我想知道人们对这个场景的看法:你有一个代表商品价格的输入,比如为用户购买的商品填写表格。你有一些实用程序可以让数字有一定数量的小数,而不是负数,等等。当然,输入中的值本身需要是一个字符串,因为它在一天结束时是html。两种选择的优点/缺点是什么:
- 编写一些代码,接受数字类型的初始值,将数字格式化为字符串表示,然后解析回数字表示,这两件事都可以处理从美分到美元的潜在转换,等等。或
- 将初始值格式化为字符串,并继续处理字符串值,然后在提交给api时,将其解析为api所需的值(在本例中,值以美分为单位(
我觉得这两种方法都有折衷,但将事物保持为字符串总是更解耦的,这在提交、验证(例如,检查值是否大于0,必须在验证前转换为数字(等地方附带了一些额外的代码,但在表单级别保持简单。
另一方面,如果你的应用程序中有很多地方都有价格输入字段,那么将数字保持为表单状态中的值可能更有意义,并且可以将表单状态提交给api,而不用担心它是正确的类型/值,这听起来既好又方便。
在一天结束时,DOM输入使用字符串。请记住,历史上表单数据是作为查询参数提交的。
React Final Form从第一天起就有parse
和format
道具,但根据我的经验,我建议不要使用它们。我的建议是:保留表单值字符串,如果必须的话,在提交时将它们解析为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都支持以某种方式解析为数字。