#javascript #reactjs #yup
#javascript #reactjs #да
Вопрос:
Итак, во время изучения форм я нашел этот пакет — да, для проверки. Но у меня возникает проблема
Итак, я объясню постановку проблемы и то, что я пробовал до сих пор.
Итак, вариант использования таков: у меня есть поле выбора, которое имеет два параметра, резидентный и нерезидентный, поэтому на основе выбора у меня есть разные поля, которые я отображаю
- Резидент: first_name, last_name
- Нерезидент: passport_number, country, state
Итак, вот что я подумал о разделении схемы и на основе выбора, я хочу добавить схему дополнительных полей для проверки.
const required = () => "Field is required";
const resident_schema = object({
first_name: string().required(required).nullable(),
last_name: string().required(required).nullable(),
});
const non_resident_schema = object({
passport_number: string().required(required).nullable(),
country: object().required(required).nullable(),
state: object().required(required).nullable(),
});
const schemaBasedCitizen = {
RESIDENT: resident_schema,
NON-RESIDENT: non_resident_schema,
};
export const validationSchema = object().shape({
citizen: object().required(required).nullable(),
{ ...object().when("citizen", {
is: (value) => !!schemaBasedCitizen[value.toUpperCase()],
then: (value) => schemaBasedCitizen[value.toUpperCase()],
}) },
});
И мой html состоит из
<select>
<option disabled selected value> -- select an option -- </option>
<option value='resident'>Resident</option>
<option value='non-resident'>Non-Resident</option>
</select>
Я не могу распространяться, поскольку требуется ключ, так есть ли способ добиться этого.
Обновить
Схема, когда значение находится в выбранном поле
export const validationSchema = object().shape({
citizen: object().required(required).nullable(),
first_name: string().required(required).nullable(),
last_name: string().required(required).nullable(),
});
Схема, когда значение не является резидентным в поле выбора
export const validationSchema = object().shape({
citizen: object().required(required).nullable(),
passport_number: string().required(required).nullable(),
country: object().required(required).nullable(),
state: object().required(required).nullable(),
});
В основном проверка является динамической на основе значения в поле выбора гражданина.
Комментарии:
1. Как называется ваше поле выбора? РЕДАКТИРОВАТЬ: На самом деле, можете ли вы показать желаемый результат из обеих схем?
2. <выберите имя =»гражданин»> @Adam
3. Итак, в jsx я показываю только поля в соответствии с выбором. Обязательно обновит вопрос
4. @Adam Я обновил в соответствии с запросом, пожалуйста, проверьте
Ответ №1:
у yup есть такая вещь, что он может ссылаться только на родственные поля (или контекст), используя when
.
Ваше citizen
поле НЕ является родственным по отношению к остальной части объекта и не может использоваться для условного изменения схемы объекта, оно является дочерним объектом объекта, поэтому вы не можете ссылаться на него как на родственное поле через when
.
Одним из способов добиться желаемого может быть использование отложенной схемы:
import { lazy } from 'yup';
const residentSchema = ...
const nonResidentSchema = ...
export const validationSchema = lazy(({citizen}) => citizen === 'resident' ? residentSchema : nonResidentSchema);
Комментарии:
1. Хорошо, но одно сомнение, пробовал это, но каждый раз его перезапись. Итак, вариант использования, который я выбрал, резидентный, теперь я нажал на поле первого имени и ничего не ввел и нажал на поле фамилии, теперь отображается сообщение об ошибке, но когда я нажимаю на поле фамилии, ошибка первого имени не перезаписывается. Как я могу решить эту проблему. Таким образом, одновременно отображается только одно сообщение об ошибке, даже если два поля имеют пустое значение
2. @JohnThomas — это звучит как совершенно другая проблема (заслуживающая другого вопроса). Это зависит от структуры, которую вы используете для управления данными формы / отображения сообщений об ошибках.
3. @ Adam Уверен, что я добавлю codesandbox для воспроизведения проблемы и добавлю здесь. Пожалуйста, помогите мне в том же.
4. @ Adam это codesandbox, где я пытался, но я думаю, что происходит некоторый рендеринг. Я не понимаю, где возникает проблема. Дайте мне знать, что я здесь делаю не так, и как я могу решить проблему. Значения также сбрасываются codesandbox.io/s/dawn-dust-lnyqu
5. @JohnThomas — пожалуйста, откройте другой вопрос.