【问题标题】:Validation for TextField of Type Number验证 Number 类型的 TextField
【发布时间】:2020-04-07 19:35:41
【问题描述】:

我正在使用这个文本字段:

 <TextField
    variant="outlined"
    margin="normal"
    id="freeSeats"
    name="freeSeats"
    helperText={touched.freeSeats ? errors.freeSeats : ''}
    error={touched.freeSeats && Boolean(errors.freeSeats)}
    label="Free Seats"
    value={freeSeats}
    onChange={change.bind(null, 'freeSeats')}
  />

通过此验证:

export const schema = Yup.object({
  freeSeats: Yup.number()
    .required('This Field is Required')
    .typeError('A Number is Required'),
});

它运行良好,在我输入字母时显示错误。但是,当我添加

type="number"

在文本字段内,显示增加/减少数值的箭头,但验证不再有效。所以即使我写了一个字母,它也不会给我一个错误。如果我在输入字母后移动到另一个文本字段,则输入只会与标签重叠,就好像根本没有输入一样。

有什么方法可以让材料 UI 编号类型箭头与验证保持一致?

https://codesandbox.io/s/tender-wind-zwh6i?file=/src/App.tsx

【问题讨论】:

标签: javascript reactjs typescript material-ui formik


【解决方案1】:

下面是发生的事情。

  • &lt;input type="number"&gt; 在 DOM API 级别的该字段中是validation的最低级别。
    所以浏览器通过添加那些小箭头来处理这个问题,以表示只需要numbers。当您输入任何 letters 时,浏览器不会抱怨,但它们不会默默地接受 value

  • 因此,为了改善这种行为,大多数库都提出了高级validation
    这就是Yup 和许多表单包出现的地方。

这种冲突的行为是因为 DOM“静默低级”验证类型推翻了您的 Yup“高级”验证。

实际上,在不支持type="number" 的浏览器上,该输入会退回到type="text"
Here's on a good read on this

【讨论】:

  • 我正在使用 Material UI 的 TextField。我认为没有 NumberField。有吗?
  • 我的错,我更新了解释以涵盖您使用的内容。
【解决方案2】:

给你,它工作正常。用户无法在输入中仅输入数字字母,并且必填字段验证也可以正常工作:

https://codesandbox.io/s/vigorous-goodall-wgw2w

【讨论】:

  • 您能描述一下您所做的更改吗?因为如果我打开链接,问题和以前一样。也许你没有保存?
  • 是的,我的错,现在看看。我已经注释掉了你打电话给formik.handleBlur(props) 的那一行。让我知道它是否解决了您的问题:)
  • 不,它与标签重叠,并且“类型错误”也未显示。文本类型字段(我刚才添加的)的行为不同。
  • 很抱歉,如果您提供的代码不能复制实际情况,我无法为您提供帮助。
  • 它代表了实际情况,但也许我的问题不是很清楚。不管怎么说,还是要谢谢你。我现在只使用文本类型
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-02
  • 2020-08-07
  • 2011-03-13
  • 1970-01-01
  • 2021-08-30
  • 2023-03-19
相关资源
最近更新 更多