La differenza principale, a mio modo di vedere, è che un componente si ripete ogni volta che il suo genitore si ripete, indipendentemente dal fatto che i componenti e lo stato del componente siano cambiati.
Un componente puro, d'altra parte, non si ritrasferirà se il suo genitore si ripete, a meno che gli oggetti di scena (o lo stato) del componente puro non siano cambiati.
Ad esempio, supponiamo che abbiamo un albero dei componenti con una gerarchia a tre livelli: genitore, figli e nipoti.
Quando gli oggetti di scena del genitore vengono cambiati in modo tale da cambiare gli oggetti di scena di un solo figlio, allora:
- se tutti i componenti sono componenti regolari, verrà eseguito il rendering dell'intero albero dei componenti
- se tutti i figli e i nipoti sono componenti puri, allora solo un figlio si ridurrà e uno o tutti i suoi nipoti, a seconda che i loro oggetti di scena siano cambiati. Se ci sono molti componenti in questo albero dei componenti, ciò può significare un significativo aumento delle prestazioni.
A volte, tuttavia, l'utilizzo di componenti puri non avrà alcun impatto. Ho avuto un caso del genere quando il genitore ha ricevuto i suoi oggetti di scena da un negozio di redux e aveva bisogno di eseguire un calcolo complesso degli oggetti di scena dei suoi figli. Il genitore ha usato una lista piatta per rendere i suoi figli.
Il risultato è stato che ogni volta che si verificava anche una piccola modifica nell'archivio redux, l'intera matrice flatlist dei dati dei bambini veniva ricalcolata. Ciò significava che per ogni componente dell'albero, gli oggetti di scena erano nuovi oggetti, anche se i valori non erano cambiati.
In questo caso, i componenti puri non aiutano, e l'aumento delle prestazioni può essere ottenuto solo utilizzando componenti regolari e controllando i figli, in shouldComponentUpdate, se è necessario un rendering.