You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Yup对象配合MUI接受undefined值?

解决React Hook Form + Yup 空输入返回NaN的问题

你的问题核心是:TextField空值时返回的是空字符串"",而Yup的number()规则会尝试将空字符串转换为数字,结果得到NaN,触发类型错误——哪怕你加了.optional(),因为NaN属于无效的number类型,而非undefined。

下面是几种可行的解决方法:

方法1:通过Yup的transform转换空值

修改你的Yup Schema,给bonusPercentage添加transform方法,将空字符串转为undefined:

const schema = yup.object().shape({
  bonusPercentage: yup.number()
    .transform((value) => value === "" ? undefined : value)
    .optional()
})

原理:transform会在校验前修改输入值,把空字符串替换成undefined,而.optional()会跳过对undefined的类型校验,这样就不会触发NaN错误。

方法2:在React Hook Form的register里处理空值

在注册表单字段时,使用setValueAs将空字符串转为undefined:

<TextField
  sx={textFieldStyle}
  label='Bonus Percentage (%)'
  size='small'
  fullWidth
  {...register('bonusPercentage', {
    setValueAs: (value) => value === "" ? undefined : Number(value)
  })}
  error={Boolean(errors.bonusPercentage)}
/>

原理:setValueAs是React Hook Form提供的字段值转换钩子,提交前会把输入值转换成你需要的格式,这里直接把空值转成undefined,传给Yup的就是合法的可选值。

方法3:两种方法结合(推荐)

同时在Schema和register里处理空值,双重保障避免边界情况:

// Schema部分
const schema = yup.object().shape({
  bonusPercentage: yup.number()
    .transform((value) => value === "" || isNaN(value) ? undefined : value)
    .optional()
})

// Register部分
<TextField
  sx={textFieldStyle}
  label='Bonus Percentage (%)'
  size='small'
  fullWidth
  {...register('bonusPercentage', {
    setValueAs: (value) => value === "" ? undefined : Number(value)
  })}
  error={Boolean(errors.bonusPercentage)}
/>

补充:你之前加的type='number'其实没用,因为即使是number类型的输入框,空值时依然返回空字符串"",而非undefined,所以必须手动转换。


内容的提问来源于stack exchange,提问作者rt10

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 16:17:46