Как проверить минимальный возраст с помощью yup и moment.js?

Я создал некоторую схему регистрации

 export const registrationSchema = (translate) => Yup.object().shape({
  //... other properties that are validated.
  //       for example username
    username: Yup.string()
    .min(6, translate('validation:common.username.min', { min: 6 }))
    .max(20, translate('validation:common.username.max', { max: 20 }))
    .required(translate('validation:common.username.required')),
     DOB: Yup.lazy(value => {
        console.log('yup', value);
        if (moment().diff(moment(value), 'years') < 18)
          // Here return DOB error somehow
      })
    ...

и до сих пор это работает как шарм. Но теперь мне нужно проверить, не старше ли пользователя 18 лет. Я получаю DateOfBirth из средства выбора даты, и я могу проверить, меньше ли оно 18 с моментом.

if(moment().diff(moment(date),'years) < 18)

и это значение даты, которое я получил при использовании Yup.lazy, но не знаю, как выдать ошибку проверки, если младше 18 лет, чтобы отобразить ее в поле DOB. я даже не знаю, использую ли я правильный метод yup. Я хотел использовать yup.date(). но как получить выбранную дату внутри схемы, чтобы проверить, является ли она допустимым возрастом.


person ivica.moke    schedule 26.02.2019    source источник
comment
не могли бы вы объяснить, пожалуйста, что означает lazy в YUP, я не могу понять это из документов..   -  person kuka    schedule 02.07.2019


Ответы (1)


Вы можете использовать Yup.string следующим образом:

Yup.string().test(
  "DOB",
  "error message",
  value => {
    return moment().diff(moment(value),'years') >= 18;
  }
)

если тестовая функция возвращает true, поля проходят тест. В противном случае устанавливается ошибка.

person Baboo    schedule 26.02.2019
comment
Спасибо друг. Я пробовал с .test(), но использовал его совершенно неправильно :) Это работает как шарм. Спасибо - person ivica.moke; 27.02.2019
comment
Кроме того, если вы используете обычный function(value) { ... } в 3-м параметре (вместо функции стрелки), у вас есть доступ к специальному контексту this, который позволяет вам делать такие вещи, как возврат пользовательского сообщения об ошибке: return this.createError({ message: 'Your custom message' }); для ситуаций, когда у вас может быть другая ошибка сообщения в зависимости от значения. - person Ryan Wheale; 30.10.2019