Der Hauptunterschied besteht meines Erachtens darin, dass eine Komponente jedes Mal neu gerendert wird, wenn ihre übergeordneten Elemente erneut gerendert werden, unabhängig davon, ob sich die Requisiten und der Status der Komponente geändert haben.
Eine reine Komponente hingegen wird nicht erneut gerendert, wenn ihre übergeordneten Komponenten erneut gerendert werden, es sei denn, die Requisiten (oder der Status) der reinen Komponente haben sich geändert.
Nehmen wir zum Beispiel an, wir haben einen Komponentenbaum mit einer dreistufigen Hierarchie: Eltern, Kinder und Enkelkinder.
Wenn die Requisiten der Eltern so geändert werden, dass die Requisiten nur eines Kindes geändert werden, dann:
- Wenn alle Komponenten reguläre Komponenten sind, wird der gesamte Komponentenbaum erneut gerendert
- Wenn alle Kinder und Enkelkinder reine Komponenten sind, wird nur ein Kind und eines oder alle seiner Enkelkinder erneut rendern, je nachdem, ob ihre Requisiten geändert werden. Wenn dieser Komponentenbaum viele Komponenten enthält, kann dies eine erhebliche Leistungssteigerung bedeuten.
Manchmal hat die Verwendung reiner Komponenten jedoch keine Auswirkungen. Ich hatte einen solchen Fall, als der Elternteil seine Requisiten von einem Redux-Laden erhielt und eine komplexe Berechnung der Requisiten seiner Kinder durchführen musste. Der Elternteil verwendete eine flache Liste, um seine Kinder zu rendern.
Das Ergebnis war, dass jedes Mal, wenn sich der Redux-Speicher geringfügig änderte, das gesamte Flatlist-Array der Kinderdaten neu berechnet wurde. Dies bedeutete, dass die Requisiten für jede Komponente im Baum neue Objekte waren, auch wenn sich die Werte nicht änderten.
In diesem Fall helfen reine Komponenten nicht, und die Leistungssteigerung kann nur erreicht werden, indem reguläre Komponenten verwendet und die untergeordneten Elemente in shouldComponentUpdate eingecheckt werden, wenn ein erneuter Render erforderlich ist.