如果其中任何一个有值,则使用 Yup 制作多个 Formik 字段

Make multiple Formik-fields required with Yup if any of them have a value

我有一个使用 Yup 验证的 Formik 表单。我的问题是所有三个字段,让我们称它们为 Field1Field2Field3(都是字符串),默认情况下都是可选的,但如果有任何一个,则它们都是必需的已填写。

我的 validationSchema 应该是什么样子才能完成这项工作

我已经有了另外两个字段的起点,如果一个已经填写,另一个就不再需要了,但是其中一个必须一直填写,它看起来像这样:

field4: Yup.string()
            .ensure()
            .when('field5', {
                is: '',
                then: Yup.string().required('Please fill out Field4 or Field5'),
            }),
field5: Yup.string()
            .ensure()
            .when('field4', {
                is: '',
                then: Yup.string().required(''),
            }),

yup 中,您可以像使用 field4field5 一样使用 when 根据其他值进行检查。而且你还可以同时收听多个场

你必须小心循环依赖

有一些使用参数 noSortEdges 的解决方案,但没有太多关于它的文档。你可以找到它的测试 here.

所以一个可能的解决方案是:

const schema = yup.object().shape(
  {
    field1: yup.string().when(["field2", "field3"], {
      is: (a, b) => a !== undefined || b !== undefined,
      then: yup.string().required("Please fill out Field1, Field2 or Field3")
    }),
    field2: yup.string().when(["field1", "field3"], {
      is: (a, b) => a !== undefined || b !== undefined,
      then: yup.string().required("Please fill out Field1, Field2 or Field3")
    }),
    field3: yup.string().when(["field1", "field2"], {
      is: (a, b) => a !== undefined || b !== undefined,
      then: yup.string().required("Please fill out Field1, Field2 or Field3")
    })
  },
  [["field1", "field2"], ["field1", "field3"], ["field2", "field3"]]
);