Вы удаляете часть кода, но я предполагаю, что вы недостаточно хорошо прочитали документацию о перехватывании ответов. Используя хуки, вы не получите замену для setState
, который ранее объединял значения. Поэтому, когда вы вызываете
setInit({
[event.target.name]: event.target.value
})
, вы заменяете всю переменную init
новым объектом, поэтому другое поле будет указывать на неопределенное значение, а реакция будет изменять компонент на неуправляемый, а затем снова на контролируемый при вводе значения. ,Если вы хотите сохранить объект в состоянии, вы должны выполнить слияние самостоятельно. Проще всего было бы использовать объектный разброс как
setInit({
...init, // <- spread old state
[event.target.name]: event.target.value
})
С этим кодом старое состояние останется между входами. Я также предложил бы вам не выводить свойство состояния из имени поля, так как позже вы можете легко представить ошибку, которую вы можете создать при глобальном каррировании onChange, как
const onChange = (field) => (event) => {
setInit({
...init,
[field]: event.target.value
})
}
return (
<input onChange={onChange('name')} />
)