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

如何使用Yup对含随机属性的表单对象进行动态校验?

问题修复方案

核心问题原因

  • 构造校验Schema的逻辑错误:你通过map生成的是对象数组,直接把数组展开传入shape()方法时,数组的索引会被当作对象的键,完全无法匹配你想要的字段-校验规则对应结构。
  • Yup默认规则问题:Yup.string().required()仅会校验值不是undefined或null,空字符串''会被判定为合法值,所以你示例里的空值不会触发校验错误。

修正后的代码

const validateForm = async (data) => {
  try {
    parametersFormRef.current.setErrors({});

    // 用reduce合并生成完整的校验规则对象
    const shapeRules = Object.keys(data).reduce((rules, parameter) => {
      rules[parameter] = Yup.string()
        .typeError("Test")
        .trim() // 自动过滤首尾空白字符
        .min(1, "字段不能为空") // 拦截空字符串场景
        .required("字段为必填项");
      return rules;
    }, {});

    const schema = Yup.object().shape(shapeRules);
    await schema.validate(data, { abortEarly: false });
    // 校验通过后的业务逻辑可在此处补充
  } catch (err) {
    console.error(err);
    const validationErrors = {};

    if (err instanceof Yup.ValidationError) {
      err.inner.forEach((error) => {
        validationErrors[error.path] = error.message;
      });
      // 把校验错误回填到表单
      parametersFormRef.current.setErrors(validationErrors);
    }
  }
};

补充说明

如果你的字段可能包含数字类型值,不要写死Yup.string(),可以增加类型判断匹配对应的校验方法,比如值为数字时使用Yup.number()的相关校验规则。

内容的提问来源于stack exchange,提问作者THIAGO DE BONIS

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 08:24:10