Выбор ответа Junior Рендер и reconciliation спрашивают часто обновлено

Мутация объекта в state

Вопрос

Почему после клика имя на экране не меняется?

const [user, setUser] = useState({ name: 'Аня' });
function rename() {
  user.name = 'Оля';
  setUser(user);
}

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Объект изменён по месту: ссылка та же, обновления нет. React сравнивает новое и старое значение через Object.is.

Варианты ответа

  1. setUser асинхронный, имя обновится на следующий клик
  2. Нужно вызвать forceUpdate после изменения объекта
  3. Объект изменён по месту: ссылка та же, обновления нетправильный ответ
  4. State-объекты нельзя хранить в useState, только примитивы

Разбор

React сравнивает новое и старое значение через Object.is. Ссылка та же, значит обновления нет. Нужен новый объект: setUser({ ...user, name: "Оля" }). Асинхронность тут ни при чём, следующий клик тоже ничего не покажет. forceUpdate есть только у классов. Объекты в useState хранить можно.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.