Как связать два элемента в React Hook Form, чтобы они работали вместе?

Как можно объединить компонент Select и компонент Input в одном элементе и интегрировать их с библиотекой react-hook-form в файле email-input.tsx?
  • 23 сентября 2024 г. 3:43
Ответы на вопрос 1
Вам понадобится создать компонент, который объединяет и компонент `Select`, и компонент `Input`, и интегрировать его с библиотекой `react-hook-form`. Это может выглядеть следующим образом:

1. Убедитесь, что вы установили `react-hook-form`, если вы этого еще не сделали:

```bash
npm install react-hook-form
```

2. Затем создайте файл `email-input.tsx` и добавьте в него код для вашего компонента. Предположим, что вы хотите, чтобы пользователь мог выбирать домен из выпадающего списка и вводить локальную часть почтового адреса в текстовое поле.

Вот пример реализации:

```tsx
import React from 'react';
import { useForm, Controller } from 'react-hook-form';

interface EmailInputProps {
  control: any; // Типизация для контроллера
}

const EmailInput: React.FC<EmailInputProps> = ({ control }) => {
  return (
    <div>
      <Controller
        name="localPart"
        control={control}
        defaultValue=""
        render={({ field }) => (
          <input
            {...field}
            placeholder="Введите локальную часть email"
            style={{ marginRight: '8px' }}
          />
        )}
      />
      <Controller
        name="domain"
        control={control}
        defaultValue=""
        render={({ field }) => (
          <select {...field}>
            <option value="">Выберите домен</option>
            <option value="gmail.com">gmail.com</option>
            <option value="yahoo.com">yahoo.com</option>
            <option value="hotmail.com">hotmail.com</option>
          </select>
        )}
      />
    </div>
  );
};

const FormComponent: React.FC = () => {
  const { control, handleSubmit } = useForm({
    defaultValues: {
      localPart: '',
      domain: ''
    }
  });

  const onSubmit = (data: any) => {
    alert(`Email: ${data.localPart}@${data.domain}`);
  };

  return (
    <form onSubmit={handleSubmit(onSubmit)}>
      <EmailInput control={control} />
      <button type="submit">Отправить</button>
    </form>
  );
};

export default FormComponent;
```

### Объяснение кода:

1. **Импортируем необходимые библиотеки**: Мы импортируем `React`, `useForm` и `Controller` из `react-hook-form`.

2. **Создаем компонент EmailInput**: Этот компонент содержит два элемента управления:
   - `input` для локальной части email.
   - `select` для выбора домена email.

3. **Используем `Controller` для интеграции с react-hook-form**: `Controller` помогает связать состояние контролируемого компонента с библиотекой.

4. **Создаем основной компонент формы**: В этом компоненте мы используем хук `useForm` для создания управления формой, обрабатываем отправку данных и передаем `control` в компонент `EmailInput`.

5. **Обработка отправки формы**: При отправке формы мы собираем данные локальной части и выбранного домена и выводим их в виде alert.

Теперь вы можете использовать компонент `FormComponent` в вашем приложении, и при отправке формы получите полный email адрес, объединяющий оба введенных значения.
Похожие вопросы