Условная проверка для полей на основе опции выбора — да

#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 — пожалуйста, откройте другой вопрос.