Ich bin der Hauptautor eines virtual-dom Moduls, daher könnte ich in der Lage sein, Ihre Fragen zu beantworten. Es gibt tatsächlich 2 Probleme, die hier gelöst werden müssen
- Wann sollte ich neu rendern? Antwort: Wenn ich feststelle, dass die Daten verändert wurden.
- Wie kann ich effizient neu rendern? Antwort: Durch Verwendung eines virtuellen DOMs, um einen echten DOM-Patch zu erzeugen
In React hat jeder Ihrer Komponenten einen Zustand. Dieser Zustand ist ähnlich wie ein Observable, das Sie in Knockout oder anderen MVVM-Style-Bibliotheken finden könnten. Im Wesentlichen weiß React wann, die Szene neu zu rendern, weil es beobachten kann, wann sich diese Daten ändern. Das Prüfen auf Veränderungen ist langsamer als Observables, da Sie die Daten in regelmäßigen Abständen abfragen und alle Werte in der Datenstruktur rekursiv überprüfen müssen. Im Vergleich dazu signalisiert das Setzen eines Werts im Zustand einem Zuhörer, dass sich ein Zustand geändert hat, sodass React einfach auf Änderungsereignisse im Zustand hören und das Neuzeichnen planen kann.
Der virtuelle DOM wird für eine effiziente Neurenderung des DOMs verwendet. Dies hat eigentlich nichts mit dem Überprüfen auf Veränderungen Ihrer Daten zu tun. Sie könnten mit oder ohne Prüfung auf Veränderungen auf einem virtuellen DOM neu rendern. Sie haben recht, dass etwas Overhead bei der Berechnung des Unterschieds zwischen zwei virtuellen Baumstrukturen besteht, aber der virtuelle DOM-Unterschied dient dazu zu verstehen, was im DOM aktualisiert werden muss und nicht ob sich Ihre Daten geändert haben. Tatsächlich ist der Diff-Algorithmus selbst ein Prüfer für Veränderungen, wird jedoch verwendet, um festzustellen, ob der DOM selbst verändert wurde.
Unser Ziel ist es, den virtuellen Baum nur dann neu zu rendern, wenn sich der Zustand ändert. Wenn wir ein Observable verwenden, um festzustellen, ob sich der Zustand geändert hat, ist das eine effiziente Möglichkeit, unnötige Neurenders zu verhindern, die viele unnötige Baumunterschiede verursachen würden. Wenn sich nichts geändert hat, tun wir nichts.
Ein virtueller DOM ist praktisch, weil er es uns erlaubt, unseren Code zu schreiben, als würden wir die gesamte Szene neu rendern. Hinter den Kulissen möchten wir eine Patch-Operation berechnen, die den DOM aktualisiert, um so auszusehen, wie wir es erwarten. Während der virtuelle DOM-Diff/Patch-Algorithmus wahrscheinlich nicht die optimale Lösung ist, bietet er uns einen sehr schönen Weg, um unsere Anwendungen auszudrücken. Wir erklären einfach genau, was wir wollen, und React/virtual-dom wird herausfinden, wie Ihre Szene so aussehen soll. Wir müssen keine manuelle DOM-Manipulation durchführen oder verwirrt über den vorherigen DOM-Zustand sein. Wir müssen auch nicht die gesamte Szene neu rendern, was viel weniger effizient sein könnte, als sie zu patchen.