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

使用Yup时,如何获取所有验证通过的表单字段?

Yup获取所有验证通过字段的解决方案

方法1:逐个验证Schema字段

直接遍历Schema的所有字段,对每个字段单独执行验证,收集验证成功的字段:

const schema = yup.object().shape({
  firstName: yup.string().required(),
  lastName: yup.string().required(),
  nickname: yup.string().optional(),
});

const form = { firstName: "Jane" };

// 获取Schema定义的所有字段名
const allFields = Object.keys(schema.fields);
const passedFields = [];

allFields.forEach(field => {
  try {
    // 单独验证当前字段的值
    schema.fields[field].validateSync(form[field], { abortEarly: false });
    passedFields.push(field);
  } catch (err) {
    // 验证失败则跳过该字段
  }
});

console.log(passedFields); // 输出: ["firstName", "nickname"]

方法2:通过失败字段反向推导

先获取所有验证失败的字段,再用Schema的全部字段减去失败字段,得到验证通过的字段:

const schema = yup.object().shape({
  firstName: yup.string().required(),
  lastName: yup.string().required(),
  nickname: yup.string().optional(),
});

const form = { firstName: "Jane" };

let failedFields = [];
try {
  // 开启abortEarly: false以收集所有失败字段
  schema.validateSync(form, { abortEarly: false });
} catch (err) {
  // 提取所有失败字段的路径
  failedFields = err.inner.map(item => item.path);
}

// 计算验证通过的字段
const allFields = Object.keys(schema.fields);
const passedFields = allFields.filter(field => !failedFields.includes(field));

console.log(passedFields); // 输出: ["firstName", "nickname"]

关键说明

  • 对于optional()标记的字段,即使表单中没有对应值(如示例中的nickname),Yup会默认判定验证通过,因为optional()允许字段缺失或为undefined。
  • 两种方法各有适用场景:字段数量较少时,逐个验证更直观;字段较多时,反向推导的方式性能更优。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 19:15:51