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.