Как добавить и удалить поле проверки в yup.validationSchema

#reactjs #formik #yup

#reactjs #formik #ага

Вопрос:

Как добавить и удалить поле проверки в yup.validationSchema

 const validationSchema = yup.object().shape({
    password: yup
        .string()
        .label('Password')
        .required()
        .min(2, 'Seems a bit short...')
        .max(10, 'We prefer insecure system, try a shorter password.'),
    });
  

Ответ №1:

для добавления проверки вы можете использовать concat, ознакомьтесь с документацией здесь:

https://github.com/jquense/yup#mixedconcatschema-schema-schema

Вы можете определить свою базовую проверку и добавить дополнительные проверки позже. Будьте осторожны, что вы просто объединяете один и тот же тип.

Пример:

 const requiredSchema = Yup.string().required();
const min2Schema     = Yup.string().min(2, 'Seems a bit short...');
const passwordSchema = Yup.string()
                 .label('Password')
                 .max(10, 'We prefer insecure system, try a shorter password.')
                 .concat(requiredSchema)
                 .concat(min2Schema);
  

Все эти схемы являются схемами .string().
Вы можете просто объединить объект с объектами, строку со строками, число с числами и т.д.

Для выполнения условных проверок вы можете просто добавить встроенное условие:

 let isRequired = true;

const nameAndPasswordSchemaObject = Yup.object().shape({
    name: nameSchema.concat( isRequired ? requiredSchema : null ),
    password: passwordSchema,
});
  

То же самое касается yup-объектов:

 const emailSchemaObject = Yup.object({
   email: Yup.string().concat(requiredSchema)
});

const validationSchema = nameAndPasswordSchemaObject.concat(emailSchemaObject);
  

Я надеюсь, что это поможет.

Об удалении схем я ничего не мог видеть в документации (но это никогда не было нужно)

Комментарии:

1. Решена моя проблема. Использовал его как таковой «formSchema = formSchema.concat (dateSchema);»

Ответ №2:

Для тех, кто ищет другой подход, например, зависящий от значения внутри самой схемы

 import * as yup from 'yup';

export const Schema = yup
  .object()
  .shape({
    name: yup.string().lowercase().required(),
    phone: yup.number().default(0).required(),
  })
  .when((values, schema) => {
    if (values.name === 'john') {
      return schema.shape({
        isHungry: yup.boolean().required(),
        food: yup.string().default('Pizza'),
      });
    }
  });