PassFront
  1. PassFront
  2. База знаний
  3. Рендеринг и производительность

Как реализовать мемоизацию в классовых компонентах?

Рендеринг и производительность

В классовых компонентах мемоизация делается другими инструментами: PureComponent / shouldComponentUpdate вместо React.memo и мемоизация методов/значений вместо useCallback/useMemo.

PureComponent — аналог React.memo

class UserCard extends React.PureComponent {
  render() {
    return <div>{this.props.user.name}</div>;
  }
}

PureComponent автоматически реализует shouldComponentUpdate с поверхностным сравнением props и state: не изменились — рендер пропускается. Те же ловушки, что у memo: новые ссылки (инлайн-объекты/функции) ломают сравнение.

shouldComponentUpdate — ручной контроль

class Chart extends React.Component {
  shouldComponentUpdate(nextProps) {
    return nextProps.data.version !== this.props.data.version;
  }
  render() { ... }
}

Вернуть false — пропустить рендер. Полный аналог кастомного компаратора в React.memo (с обратной логикой возврата).

Стабильные ссылки на методы (аналог useCallback)

В классах это бесплатно: метод, объявленный как поле класса, создаётся один раз на инстанс:

class Form extends React.Component {
  handleSubmit = () => { ... }; // стабильная ссылка навсегда

  render() {
    return <Child onSubmit={this.handleSubmit} />; // PureComponent-ребёнок не ломается
  }
}

Ошибка — onSubmit={() => this.submit()} в render: новая функция каждый рендер.

Мемоизация вычислений (аналог useMemo)

Встроенного нет — используют memoize-one или ручной кеш:

filterItems = memoizeOne((items, query) =>
  items.filter((i) => i.name.includes(query)),
);
render() {
  const visible = this.filterItems(this.props.items, this.state.query);
}

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

В классах: PureComponent (авто-поверхностное сравнение) или shouldComponentUpdate (ручное) вместо React.memo; методы-поля класса дают стабильные колбэки без useCallback; для кеша вычислений — memoize-one. Ловушки те же: инлайн-объекты и функции в render ломают сравнение.

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