2016-08-04 7 views
0

Ich habe eine Liste (immutable.js) in meinem Speicher mit mehreren Objekten. Diese Liste wird in einer Komponente als Tabelle mit Zeilen angezeigt. Diese Zeilen sind Unterkomponenten, die ein einzelnes Objekt anzeigen. Ein Attribut dieser Objekte sollte bearbeitbar sein. So onChange() ich eine Aktion, die das Attribut des einen bestimmten Objekts ändern sollte. Da wir den Zustand niemals ändern sollten, gebe ich eine ganze neue Liste mit nur diesem geänderten Objekt zurück. Da es sich jedoch bei der gesamten Liste um ein neues Listenobjekt handelt, wird die Tabellenkomponente bei jeder einzelnen Änderung aktualisiert. Dies führt zu einer wirklich langsam funktionierenden App.React Redux rerders gesamte Liste auf einzelne Objekt Attribut ändern

Ich habe gerade den offiziellen todo app example angesehen und es mit dem Perf-Addon inspiziert. In der Erkenntnis, dass sie bei jeder Änderung auch die gesamte Todo-Liste neu anordnen (als erledigt markieren, Markierung aufheben). Wie soll ich das beheben?

+0

Meinst du "alle DOM neu erstellen" oder die "render" -Methode aufrufen? der zweite Fall ist normal, aber die virtualDOM wissen, welches Element DOM er rerender –

+0

Bitte zeigen Sie Ihren Code. Es wird viel einfacher sein zu helfen, wenn wir sehen können, wie Sie das tun. – ajmajmajma

Antwort

1

Die größten Faktoren, die sich auf die Leistung beim Rendern von Listen auswirken, sind hohe Rendering-Zyklen und teure DOM-Mutationen. Stellen Sie sicher, dass Ihre Listenelemente beim Rendern so effizient wie möglich sind. Richtig ausgeführt, wird dies einen großen Unterschied machen.

Sie haben ein paar einfache Optionen.

  • Zerlegen Sie Ihre Zeilen in eine eigene Komponente (falls noch nicht geschehen) und optimieren Sie den Render- und Aktualisierungszyklus.

  • Verwenden Sie eine Bibliothek wie react-virtualized, um die Leistung von Liste/Tabelle/Raster zu unterstützen.

  • +0

    Meine Zeilen sind eigene Komponenten und '@ connect'ed zum Speicher. Aber Perf sagt mir, dass die connect (rowComponent) "Komponente" x mal neu gerendert wird und daher verschwendet wird. – Marc

    +0

    @Marc Sie müssen den Renderzyklus dieser Komponenten optimieren, um den Aktualisierungszyklus kurzzuschließen. Check out https://facebook.github.io/react/docs/component-specs.html#updating-shouldcomponentupdate – nsmarks

    +0

    Ich weiß, aber wie soll ich sie vergleichen? Die übergeordnete Komponente (Tabelle) gibt sich selbst neu, weil die Liste jetzt ein anderes Objekt ist. Und wenn sich die Tabelle selbst neu rendert, rendert sich die Verbindung (rowComponent) selbst neu. die rowComponent wird nicht neu gerendert, aber die connect (rowcomponent) und die Anwendung ist wirklich laggy – Marc