Что такое React.PureComponent
PureComponent — это специальный тип классового компонента в React, который автоматически реализует метод shouldComponentUpdate() с поверхностным сравнением props
и state
.
Если входные данные (props или state) не изменились, компонент не перерисовывается.
Синтаксис
import React, { PureComponent } from 'react';
class MyComponent extends PureComponent {
render() {
console.log('Рендер!');
return <div>{this.props.name}</div>;
}
}
Как это работает?
Внутри PureComponent
уже реализован метод:
shouldComponentUpdate(nextProps, nextState) {
return shallowCompare(this.props, nextProps) || shallowCompare(this.state, nextState);
}
- Сравнение происходит поверхностно (shallow compare)
- Это значит, если вы передадите новый объект/массив, даже с теми же данными — компонент перерисуется
- Но если ссылки не изменились — перерисовки не будет
В чём отличие от Component?
Компонент | Поведение |
---|---|
React.Component | Всегда перерисовывается при изменении props или state |
React.PureComponent | Сравнивает props и state, и может избежать лишнего рендера |
Пример: когда это работает
class Counter extends React.PureComponent {
render() {
console.log("Рендер Counter");
return <div>{this.props.value}</div>;
}
}
export default function App() {
const [count, setCount] = useState(0);
return (
<>
<Counter value={count} />
<button onClick={() => setCount(0)}>Обновить</button>
</>
);
}
Если нажать на кнопку, значение count
не изменится — и PureComponent
не перерендерится.
Важно помнить
PureComponent
не работает с вложенными объектами или массивами (если вы мутировали их)- Всегда используйте иммутабельность (
spread
,map
,filter
,slice
) для корректного сравнения
Ограничение:
PureComponent
делает только поверхностное сравнение. Если вы измените внутренности объекта без изменения ссылки — React этого не заметит.
Когда использовать?
- Если компонент зависит только от
props
иstate
без побочных эффектов - Когда компонент часто перерендеривается с одинаковыми данными
- При работе с классовыми компонентами (в функциональных используйте
React.memo
)
Альтернатива для функциональных компонентов
const MyComponent = React.memo((props) => {
return <div>{props.value}</div>;
});
Вывод
PureComponent
помогает избежать лишних перерисовок в классовых компонентах- Делает сравнение
props
иstate
по ссылке - Идеален для простых или переиспользуемых компонентов без глубоких объектов