Да, проверка с двумя связанными полями

Я использую formik для управления формой реагировать, у меня есть вопрос о проверке с Yup.

У меня есть два поля, одно из которых - выбор элемента управления для выбора страны, а другое - почтовый индекс.

В массиве страны у нас есть регулярное выражение для проверки почтового индекса, и идея состоит в том, чтобы проверить введенный почтовый индекс, используя регулярное выражение текущей выбранной страны, кто-то может дать подсказку, как это сделать.

7 ответов

Пример поля, для которого требуется числовое значение, которое не может быть больше, чем умножение значений двух других полей.

const validationSchema = Yup.object().shape({
    num1: Yup.number().positive().required('This field is required.'),
    num2: Yup.number().positive().required('This field is required.'),
    num3: Yup.number().positive().required('This field is required.').when(['num1', 'num2'], (num1, num2, schema) => {
        return num1 > 0 && num2 > 0 ? schema.max(num1 / num2) : schema.max(0);
    })
});

Вот пример принудительного использования даты окончания для datepicker after дата начала:

      const schema = Yup.object().shape({
    start_date: Yup.date()
        .typeError('Start Date is required')
        .required('Start Date is required'),
    end_date: Yup.date()
        .typeError('End Date is required')
        .required('End Date is required')
        .when('start_date', (start_date) => {
            if (start_date) {
                return Yup.date()
                    .min(start_date, 'End Date must be after Start Date')
                    .typeError('End Date is required')
            }
        }),
})

Требовалось поставить if оператор для правильной проверки во время загрузки формы, а также необходимо было поместить typeError правило, чтобы правильно проверить, когда была выбрана начальная дата, а конечная - еще не была.

Важно то, что вы можете увидеть использование when; первый параметр - это поле для проверки, а второй параметр - это функция проверки, которая возвращает объект проверки Yup.

Я попытался просто вернуть true или false, но, похоже, это вызывало ошибки, поэтому это немного сложнее, чем просто функция чистой проверки.

Проверка с использованием значения другого поля формы с помощью Yup test().

Вы можете получить доступ к значению любого поля формы, разрушив родительский элемент, например const { country } = this.parent;

      const yup = require("yup");

const schema = yup.object({
  country: yup.object().required("This field is required"),
  zipcode: yup
    .string()
    .required("This field is required")
    .test("is-right-zipcode", "Invalid zipcode", function(code) {
      const { country } = this.parent;
      return code.match(country.regex);
    })
});

У меня была точно такая же проблема. Я мог использоватьwhen решить это.

import { object, string } from 'yup';

const validCountries = ['US', 'CA'];

const zipRegexes = {
    US: /^\d{5}(?:-?\d{4})?$/,
    CA: /^[ABCEGHJKLMNPRSTVXY]\d[A-Z]\d[A-Z]\d$/
};

const addressSchema = object().shape({
    country: string()
        .oneOf(validCountries, 'Please select a country from the list above')
        .required('Please select a country from the list above'),
    /* Other fields
    .
    .
    .
    */
    zip: string()
        .trim()
        .required('Required')
        .transform(value => value.toUpperCase())
        .when('country', (country, schema) => {
            if (
                string()
                    .oneOf(validCountries)
                    .required()
                    .isValid(country)
            ) {
                return schema.matches(
                    zipRegexes[country],
                    `not a valid ${country} zip code`
                );
            }

            return schema;
        })
});
let schema = object({
  isBig: boolean(),
  count: number()
    .when('isBig', {
      is: true, // alternatively: (val) => val == true
      then: yup.number().min(5),
      otherwise: yup.number().min(0),
    })
});

Использование .when() и передайте ему функцию, которая возвращает схему для почтового индекса в зависимости от значения страны.

Вы можете выполнить условную проверку на основе массива полей. Пример ниже сделает field6 требуется, только если хотя бы один из field1 - field5 не указано.

      let schema = object({
  field1: Yup.bool(),
  field2: Yup.bool(),
  field3: Yup.bool(),
  field4: Yup.bool(),
  field5: Yup.bool(),
  field6: Yup.bool().when(
    [
      'field1',
      'field2',
      'field3',
      'field4',
      'field5',
    ],
    {
      is: (...fields) => fields.some(Boolean),
      then: Yup.bool().notRequired(),
      otherwise: Yup.bool().required(),
    }
  ),
});
Другие вопросы по тегам