как обновить объект состояния в react?

#reactjs

#reactjs

Вопрос:

Я определяю состояние

 const [newOption, setNewOption] = useState({ name: "", age: 30 });
  

затем я хочу его обновить.

 <input
    type="text"
    value={newOption.name}
    onChange={(e) => setNewOption((prevState) => ({...prevState, name: e.target.value}))}
/>
  

но я получаю TypeError: не удается прочитать свойство ‘value’ null, когда я начинаю печатать

Мне нужно передать событие, но как?

Ответ №1:

React использует синтетические события, которые объединяются в пул. Это означает, что React будет повторно использовать объект event для других событий в вашем приложении. Для этого React обнулит ваш объект события (установит значения объекта события равными null), как только обработчик вашего события завершит выполнение. Поскольку setNewOption() он асинхронный, ваш обратный вызов может выполняться после того, как React аннулирует объект события. Вот почему вы видите:

Ошибка типа: не удается прочитать значение свойства null

поскольку React уже обнулил объект события, so e.target будет иметь значение null .

Одним из решений для исправления этого является использование e.persist() , которое предотвратит объединение и аннулирование объекта события:

 <input
    type="text"
    value={newOption.name}
    onChange={(e) => {
       e.persist();
       setNewOption((prevState) => ({...prevState, name: e.target.value}))
    }}
/>
  

React 17 планирует удалить это поведение, хотя в будущих версиях React вам не придется этого делать.

Ответ №2:

Просто сделайте это:

 <input
    type="text"
    value={newOption.name}
    onChange={(e) => setNewOption({ ...newOption, name: e.target.value })}
/>
  

Ответ №3:

Чтобы обновить объект состояния в react, вам также необходимо обновить значение и передать предыдущее состояние.

Примером этого может быть:

 setState(prevState => ({...prevState, name: value }))