React: предупреждение "A component is changing an uncontrolled input of type text to be controlled"

Предупреждение "A component is changing an uncontrolled input of type text to be controlled" возникает в React, когда компонент меняет состояние элемента input
с неконтролируемого на контролируемое. Рассмотрим, что означает это предупреждение, почему оно появляется и как можно избежать таких ошибок.
Причины предупреждения
В React элементы ввода могут быть либо контролируемыми, либо неконтролируемыми:
- Контролируемые элементы: Их состояние управляется React через значение, переданное как
value
и обновляемое при каждом изменении. - Неконтролируемые элементы: React не управляет их значением напрямую, вместо этого значение хранится в самом DOM, и обновление происходит через
ref
или при отправке формы.
Когда в React компонент пытается изменить input
с неконтролируемого на контролируемое состояние (например, с undefined
на пустую строку ""
), это вызывает предупреждение.
Пример возникновения предупреждения
Предположим, мы создаем форму с полем input
, значение которого зависит от состояния. Если состояние изначально не определено, input
будет неконтролируемым, но при обновлении станет контролируемым, что вызовет предупреждение:
import React, { useState } from 'react';
function MyForm() {
const [name, setName] = useState();
return (
<input
type="text"
value={name}
onChange={(e) => setName(e.target.value)}
/>
);
}
Здесь name
инициализируется как undefined
, поэтому input
становится неконтролируемым, пока не произойдет первое изменение состояния.
Исправление ошибки: инициализация состояния
Чтобы избежать предупреждения, следует сразу инициализировать состояние контролируемым значением, например, пустой строкой ""
:
import React, { useState } from 'react';
function MyForm() {
const [name, setName] = useState("");
return (
<input
type="text"
value={name}
onChange={(e) => setName(e.target.value)}
/>
);
}
Теперь input
всегда будет контролируемым, и предупреждение исчезнет.
Контролируемые и неконтролируемые элементы: когда использовать
Контролируемые элементы позволяют управлять состоянием компонента и чаще всего предпочтительнее, так как дают возможность отслеживать и изменять значение с помощью пропсов. Неконтролируемые элементы полезны в случаях, когда компонент не нуждается в постоянном отслеживании состояния.
Рекомендации по работе с формами в React
- При инициализации состояния используйте пустые строки для текстовых полей, чтобы избежать неконтролируемых значений.
- В случаях, когда нужно сохранить состояние вне React, используйте
ref
для работы с неконтролируемыми элементами. - Если компоненту требуется состояние только при отправке формы, неконтролируемые элементы могут быть подходящим выбором.
Дополнительные ресурсы и вакансии
Изучите наши статьи, чтобы глубже разобраться в работе с состоянием и управлением в React: о проблеме с методами массивов в React и о создании системы доступа к компонентам на основе ролей.