Хук React.useState() не отражает новое значение

ВОПРОС: Почему моя функция setContact() не работает?

Моя декларация хука:

const [contact, setContact] = useState({
fName: "",
lName: "",
email: ""});

Мой элемент пользовательского интерфейса:

<input
      name = "email"
      placeholder = "Email"
      onChange = {catchEmail}
      value = {contact.email}
    />

Мой обработчик onChange:

function catchEmail(event) {
const { value: email } = event.target;
setContact((prevValue) => {
  prevValue.email += email;
  return prevValue;
});

}

Я знаю, как заставить его работать, но я хочу понять, что не так с этим кодом.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
248
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Изменение DOM (иногда) дорого. React, понимая это, не выполняет повторный рендеринг компонентов, если новое состояние точно такое же (===), что и старое состояние.

Здесь, поскольку вы изменяете существующее состояние и возвращаете его, новое состояние — это тот же объект, что и старое состояние, поэтому React пропускает повторный рендеринг.

Вам нужно вернуть новый объект, чтобы React знал, что нужно выполнить повторный рендеринг.

setContact(prevValue => ({
  ...prevValue,
  email
}));

(вы не хотите конкатенировать существующее значение email, вы почти наверняка хотите установить новое значение состояния email в новое полное входное значение)

Вы также можете избежать этой проблемы, разделив различные значения состояния, например, do:

const [email, setEmail] = useState('');
onChange = {e => setEmail(e.target.vaue)}

как обычно рекомендуется с крючками.

Или, если вы хотите сохранить свое состояние в одном объекте, иметь взаимозависимость между битами этого состояния при обновлении или зависеть от предыдущего состояния при установке следующего, useReducer — лучший способ справиться с этим. reactjs.org/docs/….

dpwr 13.12.2020 01:28

Спасибо! Оператор спреда работает. Я ценю ваше время и помощь!

olwg199 13.12.2020 01:32

Другие вопросы по теме