Как сжать Yup "когда" проверки
У меня есть несколько полей, которые являются обязательными, если выполняется одно условие. Есть ли лучший способ сжать этот код, чтобы избежать повторения when
для всех этих полей?
const requiredForDiffAddress = {
is: false,
then: Yup.string().required()
};
export const BillingAddressYupValidationSchemaShape = {
useShippingAddress: Yup.boolean().default(true).required(),
street: Yup.string()
.when('useShippingAddress', requiredForDiffAddress),
city: Yup.string()
.when('useShippingAddress', requiredForDiffAddress),
state: Yup.string()
.when('useShippingAddress', requiredForDiffAddress),
zipCode: Yup.string()
.when('useShippingAddress', requiredForDiffAddress),
};
Или для более реалистичного и сложного образца
const buildRequiredForDiffAddress = requiredText => ({
is: false,
then: Yup.string().required(requiredText)
});
export const BillingAddressYupValidationSchemaShape = {
useShippingAddress: Yup.boolean().default(true).required(),
street1: Yup.string().when('useShippingAddress',
buildRequiredForDiffAddress("How will we know where to send your order?")),
city: Yup.string().when('useShippingAddress',
buildRequiredForDiffAddress("What city do you live in?")),
state: Yup.string().when('useShippingAddress',
buildRequiredForDiffAddress("State please!")),
zipCode: Yup.string().when('useShippingAddress',
buildRequiredForDiffAddress("Zip Code please!")),
};
1 ответ
TL;DR: решение, опубликованное в вопросе, вероятно, является лучшим способом обработки полей, которые требуются только в том случае, если условие выполняется на основе значения какого-либо другого поля *
Расширенный ответ
Я немного посмотрел на это после того, как отправил сообщение создателю Yup.
Он предложил
расширить смешанный с
requiredIf
метод для инкапсуляции такого рода вещей
Я посмотрел на то, что будет связано с этим наряду с использованием некоторой формы lazy
, Маршрут расширения, казалось, был лучше, чем ленивый маршрут, но, в конце концов, я чувствую, что то, что у меня есть, вероятно, является лучшим решением.
Я создал этот довольно подробный CodeSandbox, и кто-то хочет нанести удар и найти лучшее решение. Я с удовольствием поменяю принятый ответ на это.
https://codesandbox.io/s/xk4r7nq9z
* ... и вы хотите настраивать обмен сообщениями об ошибках для каждого поля. Кажется, что если вы в порядке с сообщениями по умолчанию, опубликованный пример может оказаться не самым простым решением.