【问题标题】:How to validate no duplications with Yup如何使用 Yup 验证没有重复
【发布时间】:2020-05-27 23:55:59
【问题描述】:

我有一个验证,它只通过检查它们是否违反其唯一规则来验证其字段,但它允许在数组内重复。

我想要某种不允许重复值的条件。

我的对象:

respostas: Yup.array()
    .of(
      Yup.object().shape({
        nome: Yup.string()
          .trim()
          .max(1000, Messages.RESPOSTA_ENQUETE_TAMANHO_MAXIMO)
          .required(Messages.CAMPO_OBRIGATORIO)
      })
    )
    .required(Messages.RESPOSTA_QUANTIDADE_MINIMA)

例如,我将有一个这样的数组:[aaa,bbb,aaa] 允许,但我不希望这种重复。

【问题讨论】:

    标签: reactjs forms yup


    【解决方案1】:
    const { addOrEdit, recordForEdit, fabricTypeList } = props;
    const duplicateNameCheck = (list, value) => {
      for (var i = 0; i < list.length; i++) {
        if (value === list[i].name) {
          return false;
        } else {
          return true;
        }
      }
    };
    
    const validationSchema = yup.object().shape({
      name: yup
        .string()
        .required("Name is required")
        .test("Unique", "Name needs te be unique", (values) => {
          return duplicateNameCheck(fabricTypeList, values);
        }),
    });
    
    const formik = useFormik({
      initialValues: initialValues,
      validationSchema: validationSchema,
      onSubmit: (values, { setSubmitting, resetForm }) => {
        setSubmitting(true);
        addOrEdit(values, resetForm, setSubmitting);
      },
    });
    

    【讨论】:

    • @padaleiana 1. 从 yup test() 函数我们可以得到该字段值。就像 .test((values) => { return fiberId = values }),这里测试函数将它的值设置为全局变量。 2.我们也可以通过test()函数调用自定义的验证函数。这次 test() 函数除了真/假值。 false return 表示字段值重复。
    【解决方案2】:

    要验证这一点,您可以编写自己的 .test()。您可以将以下测试添加到 Yup 对象。

    .test("Unique", "Values need te be unique", values => {
        return (new Set(values)).size === values.length;
    })
    

    一般会在对象中添加错误,而不是在特定字段中。

    【讨论】:

    • 这可行,但无法向重复输入添加错误。有什么方法可以向重复项添加错误?
    猜你喜欢
    • 2020-01-01
    • 2020-08-06
    • 2021-12-20
    • 2023-01-13
    • 1970-01-01
    • 2019-07-23
    • 2019-09-29
    • 2020-11-05
    • 2019-07-11
    相关资源
    最近更新 更多