有没有办法跳过对对象数组中最后一个对象的 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 模式并使用 isValid
或 validate
来检查它,因此您无需自己进行测试。
编辑:
我刚刚创建了一个 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'),
}),
),
}),
我正在使用 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 模式并使用 isValid
或 validate
来检查它,因此您无需自己进行测试。
编辑:
我刚刚创建了一个 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'),
}),
),
}),