Główną różnicą, jak widzę, jest to, że składnik ponownie się wysyła za każdym razem, gdy jego rodzic ponownie się wysyła, niezależnie od tego, czy rekwizyty i stan składnika uległy zmianie.
Z drugiej strony, czysty komponent nie zrenderuje się, jeśli jego rodzic zrenderuje, chyba że rekwizyty (lub stan) czystego komponentu ulegną zmianie.
Załóżmy na przykład, że mamy drzewo komponentów z trzypoziomową hierarchią: rodzic, dzieci i wnuki.
Gdy rekwizyty rodzica zostaną zmienione w taki sposób, że rekwizyty tylko jednego dziecka zostaną zmienione, wówczas:
- jeśli wszystkie komponenty są zwykłymi komponentami, całe drzewo komponentów zrenderuje się
- jeśli wszystkie dzieci i wnuki są czystymi składnikami, tylko jedno dziecko się podda i jedno lub wszystkie jego wnuki, w zależności od tego, czy ich rekwizyty zostaną zmienione. Jeśli w tym drzewie komponentów znajduje się wiele komponentów, może to oznaczać znaczny wzrost wydajności.
Czasami jednak stosowanie czystych składników nie będzie miało żadnego wpływu. Miałem taki przypadek, gdy rodzic otrzymał rekwizyty ze sklepu redux i musiałem przeprowadzić skomplikowane obliczenia rekwizytów dla dzieci. Rodzic użył płaskiej listy do renderowania swoich dzieci.
W rezultacie za każdym razem, gdy nastąpiła nawet niewielka zmiana w magazynie redux, cała tablica z płaską listą danych dla dzieci była ponownie obliczana. Oznaczało to, że dla każdego komponentu drzewa rekwizyty były nowymi obiektami, nawet jeśli wartości się nie zmieniały.
W takim przypadku czyste komponenty nie pomagają, a wzrost wydajności można osiągnąć tylko przy użyciu zwykłych komponentów i sprawdzania w elementach potomnych, w shouldComponentUpdate, jeśli konieczne jest ponowne wyrenderowanie.