Увидим ли мы изменения в дочернем компоненте через пропсы, если переменная изменилась, но ререндер не произошел?
Что проверяют
Понимаете ли вы, что пропсы это снимок значений на момент рендера, а не живая ссылка на переменную родителя. И знаете ли, что запускает обновление: не изменение данных само по себе, а вызов сеттера состояния, новое значение контекста или рендер родителя.
Как отвечать
Нет, не увидим. Если ререндера не было, дочерний компонент продолжает показывать значения, которые получил в прошлый раз. React не наблюдает за переменными, он перерисовывает дерево в ответ на событие обновления.
Дальше разберите типичные причины такой ситуации:
- переменная объявлена в теле компонента или в модуле, а не в состоянии, и её изменение вообще ничего не запускает;
- объект в состоянии изменён на месте, ссылка та же, сеттер через
Object.isсчитает значение прежним и пропускает обновление; - родитель перерисовался, но ребёнок обёрнут в
memo, а изменённый пропс это тот же самый объект, и поверхностное сравнение не видит разницы; - значение лежит в
ref, аrefпо замыслу перерисовку не вызывает.
Вывод, который от вас ждут: чтобы изменение доехало, оно должно пройти через неизменяемое обновление состояния или контекста. Мутация на месте иногда срабатывает случайно, когда рядом происходит другой рендер, и это худший вариант, потому что баг получается плавающий.
Где спотыкаются
Мутируют массив и пишут setItems(items). Ссылка прежняя, обновления нет, а в консоли массив уже новый, ведь браузер показывает актуальное содержимое. Лечится копией: новый массив или новый объект вместо изменения старого.
Вторая ошибка: предлагают чинить это принудительным обновлением через смену ключа или счётчик-пустышку. Симптом уходит, причина остаётся, и соседний компонент, читающий те же данные, всё равно получит старое значение.
Третья: путают отсутствие ререндера с устаревшим замыканием. Обработчик, созданный в прошлом рендере, помнит старые пропсы даже после того, как компонент перерисовался. Симптом похож, а лечение другое: следить за зависимостями эффектов и колбэков.