Какие плюсы и минусы неуправляемого компонента?
Компоненты
Неуправляемый компонент — поле формы, значение которого хранится в DOM (defaultValue + чтение через ref), а не в React-state.
Плюсы
- Нет ререндеров при вводе: React не участвует в наборе текста — большие формы работают заметно быстрее (на этом построен React Hook Form).
- Меньше кода для сценария «заполнил → отправил»: не нужны useState и onChange на каждое поле.
- Нативное поведение из коробки: автозаполнение браузера, встроенная HTML-валидация (required, pattern, type=email), FormData при сабмите.
- Проще интеграция с не-React кодом и сторонними виджетами.
- Для
<input type="file" />— единственный вариант: значение файла нельзя задать программно.
Минусы
- Нет живой валидации и форматирования: маску телефона, лимит символов, немедленную подсветку ошибок делать неудобно (только вручную по событиям).
- Значение недоступно декларативно: чтобы показать счётчик символов или зависимое поле, всё равно нужен state.
- Императивное управление: сброс через
form.reset()или запись в ref; программная подстановка значения — не «через рендер». - Труднее тестировать и отлаживать: источник правды в DOM, а не в состоянии, которое видно в DevTools.
- Опасность смешения режимов (
value={undefined}→ предупреждение «uncontrolled to controlled»).
Когда выбирать
Простые формы «заполнил и отправил», большие формы с упором на производительность, работа с файлами, использование React Hook Form. Нужна живая логика по мере ввода — управляемый компонент.
Коротко для собеседования
Плюсы: ноль ререндеров при вводе, меньше кода, нативная валидация и автозаполнение, единственный путь для file input. Минусы: нет живой валидации и форматирования, значение недоступно декларативно, императивный сброс, сложнее отлаживать. Выбор: простые/большие формы — неуправляемые (или RHF), живая логика — управляемые.