Почему не срабатывает событие onChange при использовании react-hook-forms?

Почему событие onChange не срабатывает при загрузке файлов в инпут, если использовать {...register('avatar')}, и как это можно исправить?
  • 29 декабря 2023 г. 16:27
Ответы на вопрос 2
Событие `onChange` не срабатывает при загрузке файлов в инпут, потому что оно не вызывается непосредственно при изменении значения поля `input type="file"`. Вместо этого, при загрузке файла или выбора файла из диалогового окна, срабатывает событие `onInput` или `onBlur`.

Так как `react-hook-form` использует `onChange` для отслеживания изменений инпутов, это может вызывать проблему при использовании его с `input type="file"`. Однако, можно решить эту проблему путем использования специального компонента `Controller` из `react-hook-form`.

Вот пример кода, который поможет исправить проблему с событием `onChange` при загрузке файлов:

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

function App() {
  const { handleSubmit, control } = useForm();

  const onSubmit = (data) => {
    console.log(data);
  };

  return (
    <form onSubmit={handleSubmit(onSubmit)}>
      <Controller
        control={control}
        name="avatar"
        render={({ field }) => (
          <input
            type="file"
            onChange={(e) => field.onChange(e.target.files[0])}
            onBlur={field.onBlur}
          />
        )}
      />
      <button type="submit">Submit</button>
    </form>
  );
}

export default App;
```

В этом примере мы используем компонент `Controller` из `react-hook-form`, который позволяет нам передать функции `onChange` и `onBlur` в поле `input type="file"`. Теперь событие `onChange` будет срабатывать при загрузке файлов, и вы сможете получить выбранный файл в функции `onSubmit`.
onChange просто не работает при загрузке файлов в инпут, но если убрать {...register('avatar')}, то всё работает.


Необходимо настроить onChange через register
Похожие вопросы