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

使用Formik与Yup时,如何为数值类型字段设置无默认值的配置?

Formik + Yup 数值字段无默认值实现方案

核心逻辑

两个核心问题可通过统一初始值配置+Yup规则适配同时解决,不需要设置默认数值(如0),完全满足无默认值的需求:

1. 统一初始值配置

所有数值字段的初始值统一设为空字符串"",不要用undefined,从根源避免React抛出「非受控输入转受控输入」的报错:

const initialValues: any = {
  string: "",
  numeric1: "", // 对应type=number输入框
  numeric2: ""  // 对应type=text输入框
};

2. 适配Yup校验规则

通过Yup的transform方法和自定义错误提示,解决非数值输入提示不友好的问题,同时保证最终输出值为数字类型:

const validationSchema = yup.object().shape({
  string: yup.string().required("Required"),
  // 对应type=number的输入框
  numeric1: yup.number()
    .typeError("请输入合法的数值")
    .required("Required (numeric type)")
    // 空字符串转换为null,触发required校验
    .transform((value, originalValue) => originalValue === "" ? null : value),
  // 对应type=text的输入框
  numeric2: yup.string()
    .matches(/^-?\d+(\.\d+)?$/, "请输入合法的数值")
    .required("Required (string type)")
    // 可选:如果需要最终输出为数字类型,加这行转换
    .transform((value) => value === "" ? null : Number(value))
});

方案优势

  • 初始值无默认数值,空状态即为未填写,符合业务需求
  • 完全规避React非受控输入的报错
  • 所有非法输入的提示可自定义,对用户友好
  • 最终表单值可直接拿到数字类型,不需要二次处理

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 00:54:03