Я пытаюсь добавить проверку в поле:
- запускает проверку, когда она определена
- не запускает проверку, поле имеет начальное значение (снова)
Теперь следующий пример работает для первой проверки. Он проверяет, определено ли 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.