Выбор ответа Middle Рендер и reconciliation обновлено

Сбросить state при смене id

Вопрос

Компонент <EditProfile userId={id} /> хранит черновик формы в state. При переходе к другому пользователю черновик должен сброситься. Какой способ самый простой и идиоматичный?

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

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

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

Коротко

Правильный ответ: Передать key={userId}, чтобы создать новый экземпляр. Смена key заставляет React размонтировать старый экземпляр и смонтировать новый с начальным state, без лишнего рендера со старыми данными.

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

  1. useEffect(() => setDraft(initial), [userId])
  2. Передать key={userId}, чтобы создать новый экземплярправильный ответ
  3. Обернуть компонент в memo с компаратором по userId
  4. Хранить черновик в useRef и сбрасывать по userId

Разбор

Смена key заставляет React размонтировать старый экземпляр и смонтировать новый с начальным state, без лишнего рендера со старыми данными. Вариант с эффектом работает, но сначала отрисует старый черновик, а затем сделает ещё один рендер. memo не сбрасывает state. useRef не вызывает рендер и проблему не решает.

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

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