Как можно настроить процесс валидации для сложных форм с использованием библиотеки react-hook-form и yup?

Здравствуйте!

Я имею форму с двумя радиокнопками, представляющими два типа клиентов, и телом формы. Также есть два внешних компонента с элементами формы для каждого типа клиента. В зависимости от выбранной радиокнопки, один из внешних компонентов с инпутами должен быть добавлен в тело формы.

Изначально я создал одну общую схему валидации, и, кажется, она работала, но форма не отправлялась без каких-либо сообщений об ошибках. Мне кажется, что форма не отправлялась из-за общей схемы валидации, которая содержит инпуты, отсутствующие на странице.

Сейчас я рассматриваю два варианта. Первый - как в зависимости от условия передавать в resolver одну из нескольких схем. Второй - как создать одну динамическую схему валидации. Проект написан на TypeScript.

Как я могу передавать в resolver разные схемы в зависимости от условия? Или как создать одну динамическую схему валидации?
  • 13 декабря 2023 г. 10:28
Ответы на вопрос 2
Для решения данной проблемы вы можете использовать условия валидационной схемы, которые будут базироваться на выбранной радиокнопке.

Вот пример кода, который демонстрирует, как это можно реализовать:

```javascript
import React from "react";
import { useForm } from "react-hook-form";
import { object, string, number, when, ref } from "yup";

const schema = object().shape({
  type: string().required(),
  // Добавьте остальные поля формы, в зависимости от типа клиента
  // Пример:
  firstName: when("type", {
    is: "individual",
    then: string().required(),
    otherwise: string(),
  }),
  companyName: when("type", {
    is: "company",
    then: string().required(),
    otherwise: string(),
  }),
  // ... Добавьте остальные поля в зависимости от типа клиента
});

const Form = () => {
  const { register, handleSubmit, errors, watch } = useForm({
    validationSchema: schema,
  });

  const selectedType = watch("type"); // Получение значения выбранного типа

  const onSubmit = (data) => {
    console.log(data);
    // Выполнить отправку данных формы
  };

  return (
    <form onSubmit={handleSubmit(onSubmit)}>
      <div>
        <label>
          <input type="radio" value="individual" name="type" ref={register} />
          Individual
        </label>
        <label>
          <input type="radio" value="company" name="type" ref={register} />
          Company
        </label>
      </div>
      {selectedType === "individual" && <IndividualFields register={register} errors={errors} />}
      {selectedType === "company" && <CompanyFields register={register} errors={errors} />}
      {/* Вывод сообщений об ошибках */}
      {errors && errors.type && <span>{errors.type.message}</span>}
      {selectedType === "individual" && errors && errors.firstName && <span>{errors.firstName.message}</span>}
      {selectedType === "company" && errors && errors.companyName && <span>{errors.companyName.message}</span>}
      {/* Кнопка отправки формы */}
      <input type="submit" value="Submit" />
    </form>
  );
};

const IndividualFields = ({ register, errors }) => {
  return (
    <div>
      <input type="text" name="firstName" placeholder="First Name" ref={register} />
      {errors && errors.firstName && <span>{errors.firstName.message}</span>}
      {/* Добавьте остальные поля для физического лица */}
    </div>
  );
};

const CompanyFields = ({ register, errors }) => {
  return (
    <div>
      <input type="text" name="companyName" placeholder="Company Name" ref={register} />
      {errors && errors.companyName && <span>{errors.companyName.message}</span>}
      {/* Добавьте остальные поля для юридического лица */}
    </div>
  );
};
```

Код включает в себя две отдельные компоненты для каждого типа клиента, которые будут отображаться в зависимости от выбранной радиокнопки. Также, в коде используется библиотека `yup` для создания валидационной схемы.

Обратите внимание, что для отображения сообщений об ошибках необходимо включить соответствующие проверки ошибок для каждого поля в зависимости от выбранного типа клиента. В приведенном примере используется условный рендеринг для этого.
React introduces JSX, a syntax extension for JavaScript that allows developers to write HTML-like code within JavaScript, making it more intuitive to create UI components. react-hook-form + yup forms by react js  by full website you can visit it learn more by 
Here's a code snippet:
def rezult_all_fight(jsonElements):
value_games = jsonElements["Value"]["V"]
for item in range(0, value_games):
#Тут основная логика программы
#...
while True:
rezult_all_fight(request_json())
time.sleep(6)

When the program starts, it runs for about 15 minutes and throws the error TypeError: 'NoneType' object is not subscriptable indicates value_games = jsonElements["Value"]["V"]. What could be the reason I can’t figure it out? The variable type int, the value is always there, the data is taken from json using a request to the server.
Похожие вопросы