2016-03-30 10 views
0

Ich habe eine custom element in React verwendet. Ich möchte Attribute für das Element von React ändern können. Ich möchte auch die gleichen Attribute innerhalb des Elements selbst ändern können. Wenn das Element sein eigenes Attribut ändert, führt dies leider zu einigen seltsamen Nebeneffekten, von denen ich glaube, dass sie mit dem virtuellen DOM von React zusammenhängen, die nicht wissen, dass sich das Attribut geändert hat.Ändern von Attributen aus dem benutzerdefinierten Element innerhalb von React

Zur Veranschaulichung nehmen wir haben eine Funktion machen Reagieren, das die folgenden zurück:

<my-component foo="bar"/> 

Und my-component hat Logik innerhalb davon, dass, wenn das Element angeklickt wird, wird foo ‚s Wert von bar ändern unicorn. Alles bis zu diesem Punkt funktioniert wie erwartet. Das Problem ist, dass foo während des nächsten Renderzyklus nicht auf bar zurückgesetzt wird. I wollenfoo auf bar zurückgesetzt werden.

Meine Vermutung ist, dass virtueller DOM Reagieren hat bar als Cache gespeicherten Wert (es nicht erkennen, es zu unicorn geändert hat), und daher nicht versucht, es zu bar zurück zu setzen.

  1. Ist mein Verständnis korrekt?
  2. Wie mache ich es so foo wird der Wert auf bar auf den nächsten Render-Zyklus zurückgesetzt?
+0

React wird '' nicht berühren, wenn sich Attribute oder Kinder nicht ändern. – thangngoc89

+0

benutzerdefinierte Elemente müssen real sein - nur um mit react gut zu spielen, oder Sie können das Element den Aktualisierungszyklus von React verwenden (1-Weg) oder etwas wie redux. Kurz gesagt, ändern Sie HTML nicht ohne React. – dandavis

+0

Hört sich an, als hätten Sie irgendwo einen Strichcode ('foo =" bar "' ist hart codiert)? Betrachten Sie vielleicht einen Architekturrahmen, der darauf reagiert, den Staat zu führen und zu verwalten. Ich persönlich mag Redux. – ajmajmajma

Antwort

1

Sie haben das virtuelle DOM korrekt. Damit es sich so verhält, wie Sie es möchten, muss das benutzerdefinierte Element so geschrieben werden, dass es unterstützt wird.

Betrachten Sie das als zu controlling an <input> gleichwertig, in dem Sie einen Handler an den Eingang des binden würde onChange und entweder rufen event.preventDefault() alle Änderungen an der vlaue zu blockieren, oder den neuen Wert der <input> passieren zurück, um die virtuelle DOM zu aktualisieren.

Damit dies funktioniert, muss das benutzerdefinierte Element einen ähnlichen Event-Handler unterstützen.