Yup .mixed () не работает с дочерним братом - PullRequest
0 голосов
/ 23 апреля 2019

Моя структура данных выглядит следующим образом:

{
  foo: true,
  bar: {
    baz: [{label: 'mario', url: 'https://nintendo.com'}]
  }
}

А мой yup валидатор выглядит так:

  const schema = yup.object().shape({
    foo: yup.boolean(),
    bar: yup.mixed().when('foo', {
      is: true,
      then: yup.object().shape({
        baz: yup.array.of(
          yup.object().shape({
            label: yup.string.required(),
            url: yup.url().required()
          })
        )
      }),
      otherwise: yup.object().nullable(true)
    })
  })

Но проверка не работает для bar.baz;если foo равно true, bar никогда не выдаст ошибку, если ей не присвоен массив с необходимыми объектами.

Если я установил bar для проверки как что-то еще, скажите:

  bar: yup.mixed().when('foo', {
    is: true,
    then: yup.string().required()
    otherwise: yup.string.nullable(true)
  })

Выдает ошибку для bar, как и ожидалось.Чего мне не хватает?

1 Ответ

0 голосов
/ 23 апреля 2019

when() имеет доступ только к свойствам на том же уровне. Из документации :

mixed.when (ключи: строка | Массив, строитель: объект | (значение, схема) => Схема): Схема

Настройка схемы на основе дочерних или родных дочерних полей. Вы можете предоставить литерал объекта, где ключом является значение или функция сопоставления, затем предоставить истинную схему и / или иным образом для условия сбоя.

Вот почему ваш второй пример работает (потому что bar и foo являются братьями и сестрами). Одно из возможных решений - переставить ваши данные так, чтобы foo и baz были братьями и сестрами.

Существует по крайней мере одна проблема на Github Yup , и автор предлагает передавать данные через контекстный параметр Yup, но я не думаю, что это возможно при использовании Formik и validationSchema prop, если предположить, что это то, что вы используете.

...