In che modo i componenti stateless di React 0.14 offrono miglioramenti delle prestazioni senza shouldComponentUpdate?

8

Questa domanda è andata in giro per la mia testa da quando ho letto le note di rilascio (e altro hype relativo) su React 0.14 - Sono un grande fan di React e penso che i componenti stateless ( link ) sono un'idea eccellente, sia per la facilità di scrivere tali componenti e di esprimere in codice l'intenzione che questi componenti siano "puri" in termini di rendering coerente per gli stessi dati dei puntelli.

La domanda è: come sarà possibile per React ottimizzare queste funzioni di componenti stateless senza andare intere e assumendo che i riferimenti agli oggetti di scena non siano solo immutabili in quanto non dovrebbero essere manipolati all'interno del componente, ma anche che essi non può mai cambiare al di fuori del ciclo di vita dei componenti? La ragione per cui i componenti "regolari" (cioè i componenti stateful - in altre parole, i componenti che attraversano l'intero ciclo di vita, componentWillMount, getInitialState, ecc.) Hanno una funzione facoltativa "shouldComponentUpdate" è che React non presuppone che tutti i puntelli e i riferimenti di stato sono completamente immutabili. Dopo che i componenti sono stati renderizzati, alcune proprietà dei riferimenti degli oggetti di scena potrebbero cambiare e quindi la stessa istanza "props" potrebbe avere contenuti diversi in seguito. Questo è in parte il motivo per cui c'è stata molta eccitazione sull'uso di strutture completamente immutabili e sul motivo per cui è stato detto che l'uso di Om con React potrebbe offrire grandi guadagni in termini di prestazioni; poiché le strutture immutabili utilizzate in quel punto garantivano che qualsiasi data istanza di qualsiasi oggetto non potesse mai essere mutata, quindi dovrebbeComponentUpdate potrebbe eseguire controlli di uguaglianza di riferimento veramente economici su oggetti di scena e stato ( link ).

Ho cercato di scoprire più informazioni su questo ma non ho ottenuto da nessuna parte. Non posso immaginare quali miglioramenti delle prestazioni potrebbero essere fatti intorno a componenti stateless senza supporre che i dati degli oggetti di scena siano costituiti da tipi immutabili ... forse qualche analisi preliminare di tipi di puntelli non immutabili per cercare di indovinare se "puntelli" e "nextprops" rappresentano il stessi dati?

Mi chiedevo solo se qualcuno avesse qualche informazione interna o qualche intuizione altrimenti illuminante su questo. Se React avesse iniziato a chiedere che i tipi di puntelli fossero "completamente immutabili" (consentire confronti di uguaglianza di riferimento per confermare che i dati non sono cambiati), allora penso che sarebbe un grande passo avanti, ma potrebbe anche essere un grande cambiamento.

    
posta Dan Roberts 17.11.2015 - 21:21
fonte

1 risposta

4

C'è un problema di github nel progetto di reazione proprio su questo.

In base a questo problema github commento:

For complex components, defining shouldComponentUpdate (eg. pure render) will generally exceed the performance benefits of stateless components. The sentences in the docs are hinting at some future optimizations that we have planned, whereby we won't allocate an internal instance for stateless functional components (we will just call the function). We also might not keep holding the props, etc. Tiny optimizations. We don't talk about the details in the docs because the optimizations aren't actually implemented yet (stateless components open the doors to these optimizations).

e da un'altra risposta dello stesso collaboratore:

There are discussions about having a pureRender flag that you could set on the function, or allowing it to participate in the shouldUpdate lifecycle, but that's currently not implemented. At the moment, stateless functions can not be pure-render.

finalmente da questo commento otteniamo una risposta alla tua domanda:

we don't do pure render by default, but we may provide a way for you to opt-in in the future.

Quindi dovremo vedere come ci permetteranno di entrare in "pureRender":)

    
risposta data 28.01.2016 - 14:53
fonte

Leggi altre domande sui tag