Предупреждение. Компонент изменяет неконтролируемый ввод текста типа для управления. Элементы ввода не должны переключаться с неконтролируемого на управляемый (или наоборот). Выберите между использованием контролируемого или неконтролируемого входного элемента в течение срока службы компонента. *
Ниже приведен мой код:
constructor(props) {
super(props);
this.state = {
fields: {},
errors: {}
}
this.onSubmit = this.onSubmit.bind(this);
}
....
onChange(field, e){
let fields = this.state.fields;
fields[field] = e.target.value;
this.setState({fields});
}
....
render() {
return(
<div className="form-group">
<input
value={this.state.fields["name"]}
onChange={this.onChange.bind(this, "name")}
className="form-control"
type="text"
refs="name"
placeholder="Name *"
/>
<span style={{color: "red"}}>{this.state.errors["name"]}</span>
</div>
)
}
javascript
reactjs
Рия Капурия
источник
источник
fields
в состоянии?Ответы:
Причина в том, что вы определили:
поля как пустой объект, поэтому во время первого рендеринга
this.state.fields.name
будетundefined
, а поле ввода получит свое значение в виде:Из-за этого поле ввода станет неуправляемым.
Как только вы введете любое значение на входе,
fields
состояние будет изменено на:И в это время поле ввода преобразуется в управляемый компонент; вот почему вы получаете ошибку:
Возможные решения:
1- Определите
fields
в состоянии как:2- Или определите свойство value с помощью оценки короткого замыкания следующим образом:
источник
''
является допустимым строковым значением. поэтому, когда вы изменяете''
на 'xyz', тип ввода не меняется, значит контролируемый на контролируемый. Но в случаеundefined
сxyz
типом изменится с неконтролируемого на контролируемый.value={this.state.fields.name || ''}
Изменение
value
кdefaultValue
разрешит его.Примечание :
Я использовал
value={this.state.input ||""}
в ,input
чтобы избавиться от этого предупреждения.источник
ПРОСТО, сначала нужно установить начальное состояние
Если вы не установили начальное состояние, реакция будет рассматриваться как неконтролируемый компонент.
источник
Внутри компонента поместите поле ввода следующим образом.
источник
В дополнение к принятому ответу, если вы используете
input
типcheckbox
илиradio
, я обнаружил, что мне также необходимо проверитьchecked
атрибут на null / undefined .И если вы используете TS (или Babel), вы можете использовать нулевое слияние вместо логического оператора OR:
источник
Сначала установите текущее состояние
...this.state
Это потому, что когда вы собираетесь назначить новое состояние, оно может быть неопределенным. так что это будет исправлено путем установки состояния извлечения текущего состояния также
Если в вашем состоянии есть объект, вы должны установить состояние следующим образом, предположим, что вы должны установить имя пользователя внутри объекта пользователя.
источник
выдает ошибку, как только вы вводите текстовое поле
исправит проблему в этом примере строки.
источник
Если вы используете множественный ввод в поле, выполните следующие действия: Например:
Поиск вашей проблемы на:
источник
Использование React Hooks также не забудьте установить начальное значение.
Я использовал,
<input type='datetime-local' value={eventStart} />
и начальныйeventStart
был какconst [eventStart, setEventStart] = useState();
вместо
const [eventStart, setEventStart] = useState('');
.Пустая строка в скобках - это разница.
Кроме того, если вы сбрасываете форму после отправки, как я, снова вам нужно установить ее на пустую строку, а не только на пустые скобки.
Это всего лишь мой небольшой вклад в эту тему, возможно, это кому-нибудь поможет.
источник
В моем случае это было в значительной степени то, что говорит главный ответ Mayank Shukla. Единственная деталь заключалась в том, что в моем штате отсутствовала собственность, которую я определял.
Например, если у вас есть это состояние:
Если вы расширяете свой код, возможно, вы захотите добавить новую опору, чтобы в другом месте кода вы могли создать новое свойство
c
, значение которого не только не определено в состоянии компонента, но и само свойство не определено.Чтобы решить эту проблему, просто добавьте
c
в ваше состояние и задайте правильное начальное значение.например,
Надеюсь, мне удалось объяснить мой крайний случай.
источник
Я получаю то же предупреждение: компонент изменяет неконтролируемый ввод скрытого типа для управления. Я не могу решить мою проблему. Есть идеи почему?
я попробовал
({ valueName, valueName: {geschlecht=""}, onChangeAllg,})
иvalue={valueName.geschlecht || ""}
источник
defaultValue={""}
Внутри TextField не хватаетПредупреждение. Компонент изменяет неконтролируемый ввод текста типа для управления. Элементы ввода не должны переключаться с неконтролируемого на управляемый (или наоборот). Выберите между использованием контролируемого или неконтролируемого элемента ввода в течение срока службы компонента.
Решение: проверьте, не является ли значение неопределенным
Реагировать / Formik / Bootstrap / TypeScript
пример :
источник