Основное отличие, на мой взгляд, состоит в том, что компонент переопределяется каждый раз, когда переопределяется его родитель, независимо от того, изменились ли реквизиты и состояние компонента.
Чистый компонент, с другой стороны, не будет перерисовываться, если перерисовывается его родительский объект, если только реквизиты (или состояние) чистого компонента не изменились.
Например, допустим, что у нас есть дерево компонентов с трехуровневой иерархией: родитель, дети и внуки.
Когда реквизиты родителя меняются таким образом, что меняются реквизиты только одного потомка, то:
- если все компоненты являются обычными компонентами, то все дерево компонентов будет перерисовано
- если все дети и внуки являются чистыми компонентами, то будет переставлен только один ребенок и один или все его внуки, в зависимости от того, были ли изменены их реквизиты. Если в этом дереве компонентов много компонентов, это может означать значительное повышение производительности.
Иногда, однако, использование чистых компонентов не будет иметь никакого влияния. У меня был такой случай, когда родитель получил свой реквизит из магазина редуксов, и мне нужно было выполнить сложный расчет реквизита своих детей. Родитель использовал плоский список для визуализации своих потомков.
Результатом стало то, что каждый раз, когда происходило даже небольшое изменение в хранилище редуксов, весь плоский список данных детей пересчитывался. Это означало, что для каждого компонента в дереве реквизиты были новыми объектами, даже если значения не менялись.
В этом случае чистые компоненты не помогают, и повышение производительности может быть достигнуто только с помощью обычных компонентов и проверки в дочерних элементах, в shouldComponentUpdate, если требуется повторное отображение.