有没有办法跳过对对象数组中最后一个对象的 yup 验证?

Is there a way to skip the yup validation to the last object in an array of objects?

我正在使用 formik 来实现我们的表单。当您在上面的行中添加数据时,我们需要追加一行新的字段。提交表单时,我们收到 yup 验证错误,因为新添加的行不符合条件。请提出任何解决方案以跳过对新添加的行(最后一行)的验证。

This is the validation schema    

    Yup.object().shape({
        key1: Yup.object({
          key2: Yup.object({
            key3: Yup
              .array()
              .of(Yup.object().shape({
                salary: Yup.object({
                  description: Yup.string().matches(/^([a-zA-Z0-9]+){0,50}$/, 'description is not valid'),
                }),
              })),`enter code here`
          }),
        }),
      });

验证架构正在应用于整个对象数组,这是预期的行为。

你可以有两种方法。

1 - 在新字段中创建行。

您可以一个字段包含所有行,另一个字段只包含最后一行。这样你将需要使用 setFieldValue 所以当你添加一个新行时,你会得到最后一行字段,推送到包含所有行的字段,然后设置新的最后一行。

这可能会做太多事情,但您可以获得一个好处,即对行中的最后一项进行自定义验证(因为它在另一个字段中)。

2 - 是的自定义验证

您可以使用.test来验证数组,您可以遍历数组并忽略最后一个值。

您也可以在该函数中使用 yup 模式并使用 isValidvalidate 来检查它,因此您无需自己进行测试。

编辑:

我刚刚创建了一个 example,其中有一个字符串列表,您可以验证字符串的长度是否大于或等于 3。

它验证数组中的所有项目,最后一项除外。

对我来说,这行得通

yup.object().shape({
  users: yup
    .array()
    .transform((field) => field.slice(0,-1))
    .of(
      yup.object().shape({
        email: yup
          .string()
          .email('Email is Invalid')
          .required('Email is required'),
      }),
    ),
}),