2016-01-09 8 views
6

Wenn eine Komponente durch Aufrufen von setState aktualisiert wird, führt React den Diffing-Algorithmus für die gesamte DOM-Struktur oder nur für den Teil der aktualisierten Komponente aus?Reagiert immer der ganze Baum?

Zum Beispiel, wenn ich 10000 Komponenten in meiner App habe und setState in einer Komponente aufrufen, die keine Kinder hat (es ist ein Blatt des Baumes), wird React den gesamten großen DOM-Baum durchlaufen (was langsam wäre) nur der DOM-Baum, der von der Komponente generiert wird (was viel schneller wäre)?

Antwort

4

Nein, React wird nicht durch den gesamten Baum gehen, wenn Sie setState nur auf einem Blattknoten aufgerufen haben.

Bei Aufruf von setState wird react nur die Komponente (Baumknoten), für die setState aufgerufen wurde, und alle Komponenten (Knoten), die untergeordnet sind, erneut rendern. Es sollte beachtet werden, dass React das DOM nur dann aktualisiert, wenn tatsächlich eine Änderung vom Aufruf von setState dargestellt wird.

Vjeux, eines der Mitglieder des React-Teams, schrieb einen guten Blogbeitrag, in dem beschrieben wird, wie der read diff-Algorithmus funktioniert und wie er funktioniert, wenn Sie setState aufrufen. Hier ist die link.

+0

Es ist wichtig zu verstehen, dass wenn Sie setState für eine Komponente aufrufen, alle seine Unterbäume Komponenten gerendert werden. Um diese Leistungseinschränkung zu vermeiden, müssen wir intelligent 'boolean shouldComponentUpdate (Objekt nextProps, object nextState) verwenden. –

+0

Dies ist ein guter Punkt und es ist wichtig zu verstehen, dass setState einen großen Effekt haben kann, wenn Sie es höher in der Struktur aufrufen und diesen Staat durch Requisiten auf mehrere Ebenen herunterlassen. Ich mag das [erweiterte Leistungslink] (https://facebook.github.io/react/docs/advanced-performance.html), das die oben beschriebene Strategie der Verwendung von sollteComponentUpdate beschreibt. –

+0

Auch, obwohl es eher ein fortgeschrittenes Thema ist, kann die Verwendung von [unveränderlichen Datenstrukturen] (https://facebook.github.io/immutable-js/) und die Weitergabe dieser als Requisiten einen großen Gewinn für die Performance haben, besonders in der shouldComponentUpdate Methode. –

Verwandte Themen