PureComponent¶
Мы рекомендуем определять компоненты как функции, а не как классы.
PureComponent
похож на Component
, но он пропускает повторные рендеринги для тех же пропсов и состояний. Компоненты классов по-прежнему поддерживаются React, но мы не рекомендуем использовать их в новом коде.
1 2 3 4 5 |
|
Описание¶
PureComponent
¶
Чтобы пропустить повторное отображение компонента класса для тех же пропсов и состояния, расширьте PureComponent
вместо Component
:
1 2 3 4 5 6 7 |
|
PureComponent
является подклассом Component
и поддерживает все API Component
Расширение PureComponent
эквивалентно определению пользовательского метода shouldComponentUpdate
, который неглубоко сравнивает пропсы и состояние.
Использование¶
Пропуск ненужных рендеров для компонентов классов¶
Обычно React перерисовывает компонент каждый раз, когда перерисовывается его родитель. В качестве оптимизации вы можете создать компонент, который React не будет перерисовывать при перерисовке его родителя до тех пор, пока его новые пропсы и состояние будут такими же, как старые пропсы и состояние. Класс компонентов может выбрать такое поведение, расширяя PureComponent
:
1 2 3 4 5 |
|
Компонент React всегда должен иметь чистую логику рендеринга Это означает, что он должен возвращать тот же результат, если его пропсы, состояние и контекст не изменились. Используя PureComponent
, вы сообщаете React, что ваш компонент соответствует этому требованию, поэтому React не нужно выполнять повторный рендеринг, пока его пропсы и состояние не изменились. Однако ваш компонент все равно будет перерендерирован, если контекст, который он использует, изменится.
В этом примере обратите внимание, что компонент Greeting
перерисовывается при изменении name
(потому что это один из его пропсов), но не при изменении address
(потому что он не передается Greeting
в качестве пропса):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
|
Альтернативы¶
Миграция с компонента класса PureComponent
на функцию¶
Мы рекомендуем использовать компоненты функций вместо компонентов классов в новом коде. Если у вас есть некоторые существующие компоненты классов, использующие PureComponent
, вот как их можно преобразовать. Это оригинальный код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
|
Когда вы преобразуете этот компонент из класса в функцию, оберните его в memo
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
|
В отличие от PureComponent
, memo
не сравнивает новое и старое состояние. В функциональных компонентах вызов функции set
с тем же состоянием уже предотвращает повторные рендеринги по умолчанию, даже без memo
.