Да, метод проверки основан на том, что поле существует и не имеет начального значения - PullRequest
0 голосов
/ 09 июля 2020

Я пытаюсь добавить проверку в поле:

  • запускает проверку, когда она определена
  • не запускает проверку, поле имеет начальное значение (снова)

Теперь следующий пример работает для первой проверки. Он проверяет, определено ли myField, а затем проверяет поле с помощью теста myValidation:

// ✓ runs the validation when it's defined
// ✗ does not run the validation the field has the initial value (again)

const myValidation = Yup.string()
  .min(10, 'Should have at least 10 characters')
  .max(20, 'Should have at last 20 characters');

const validationSchema = yup.object({
  myField: yup.string.when(['myField'], {
    is: (myField) => {
      return !!myField
    },
    then: myValidation(),
  },
)}

Но как я могу объединить это с проверкой начального значения?

Я думал в строки:

import * as yup from 'yup';

const myValidation = Yup.string()
  .min(10, 'Should have at least 10 characters')
  .max(20, 'Should have at last 20 characters');

yup.addMethod(Yup.string, 'requiredWhen', function() {
  return this.test({
    name: 'requiredWhen',
    exclusive: true,
    message: 'This is required',

    test: function(value) {
      const { context } = this.options;
      const { myField: initialValue } = context;
      if (value !== initialValue) {
        // is this possible?
        // then: myValidation()
      }

      return true;
    }
  })
});

const validationSchema = yup.object({
  myField: yup.string().requiredWhen(),
});

const validate = (values, initialValues) => validationSchema
  .validate(values, { abortEarly: false, context: initialValues })
  .catch(err => {
    throw yupToFormErrors(err);
  });

const MyForm = ({ initialValues }) => (
  <Formik
    initialValues={initialValues}
    validate={(values) => validate(values, initialValues)}
  />
);

Но я не уверен, как применить 'then' внутри теста addMethod.

...