PassFront
  1. PassFront
  2. База знаний
  3. Жизненный цикл

Зачем нужен Should Component Update?

Жизненный цикл

shouldComponentUpdate(nextProps, nextState) — метод классового компонента, позволяющий вручную отменить лишний ререндер: вернул false — React пропустит рендер и обновление DOM для этого поддерева.

Зачем нужен

По умолчанию классовый компонент перерисовывается при каждом setState и при каждом рендере родителя — независимо от того, изменились ли данные. shouldComponentUpdate — точка контроля:

class Chart extends React.Component {
  shouldComponentUpdate(nextProps) {
    return nextProps.data.revision !== this.props.data.revision; // false = не рендерить
  }

  render() { /* дорогой рендер */ }
}

Применяется для дорогих компонентов (графики, большие таблицы), где рендер стоит заметно дороже сравнения.

PureComponent — автоматическая версия

React.PureComponent реализует shouldComponentUpdate с поверхностным сравнением props и state. Отсюда его требования: иммутабельность (мутации невидимы) и стабильные ссылки (инлайн-объекты и стрелки в render ломают проверку).

Функциональный аналог

React.memo(Component, arePropsEqual?). Обратите внимание на противоположную семантику возврата: в shouldComponentUpdate true = рендерить, в компараторе memo true = не рендерить.

Осторожно

Неверная логика (забыли сравнить какой-то проп) «замораживает» компонент с устаревшими данными — баг корректности, худший, чем лишний рендер. Поэтому ручное сравнение применяют точечно и по результатам профилирования.

Коротко для собеседования

shouldComponentUpdate позволяет вернуть false и пропустить ререндер классового компонента — ручная оптимизация для дорогих рендеров. Автоматическая версия с поверхностным сравнением — PureComponent, функциональная — React.memo (у него в компараторе true означает «не рендерить»). Ошибка в сравнении даёт застывший UI.

Другие вопросы раздела