如何用 Yup 验证没有重复

How to validate no duplications with Yup

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

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

我的对象:

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] 允许,但我不想重复。

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

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

错误一般会加在对象上,不会加在特定的字段上。

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);
  },
});