2016-09-15 5 views
1

Ich habe ein React-Element mit einem Namen Attribut und Kind Text, die beide aus dem gleichen Wert in Requisiten genommen werden. React nicht aktualisieren Attribut beim Neu-Rendering

Wenn eine Komponente mit einem anderen prop Wert Reagieren wieder Rendering, nur das Kind Text aktualisiert wird, aber der Name Attribut bleibt gleich:

var Inner = React.createClass({ 
    render: function() { 
     var name = this.props.name; 
     return (<div name={name}>{name}</div>); 
    } 
}); 

React.render(<Inner name="red"/>, document.getElementById('outer')); 
// element is now <div name="red" data-reactid=".0">red</div> 

React.render(<Inner name="green"/>, document.getElementById('outer')); 
// element is now <div name="red" data-reactid=".0">green</div> 

Wie Sie sehen können, nach dem zweiten Aufruf React.render , das Attribut name ist immer noch rot. (siehe http://jsfiddle.net/chyp9mxL/)

Dieses Problem kann durch Hinzufügen einer key={name} in der Render-Funktion behoben werden, aber ich sehe nicht, warum ich muss. Werden Schlüssel nicht benötigt, wenn wir mehrere Komponenten haben? Wir haben nur einen hier.

+0

Ich versuche herauszufinden, warum Sie zwei 'React.render()' haben ... – Chris

+0

Dies funktioniert gut mit der neuen Version von react und react-dom. Also, schließen Sie read-dom ein und rufen Sie ReactDOM.render statt React.render auf und das sollte es tun. –

+0

@Chris Nur um das einfachste Beispiel zur Veranschaulichung des Problems zu bieten. Ich stelle mir vor, dass im zweiten Leben der zweite Render durch eine Benutzeraktion ausgelöst wird. – jmak

Antwort

2

Liegt das daran, dass divname nicht als gültige Stütze erkennt? Ich erinnere mich, dass das Übergeben illegaler Requisiten an native DOM-Elemente zu unerwarteten Ergebnissen führt.

Das Hinzufügen key als eine Stütze hätte einfach div eine Identität gegeben. Daher könnte React dieses Kind identifizieren und den Wert korrekt aktualisieren.

Der Schlüssel hier ist nicht alles zu verstehen, in der DOM eine Darstellung hat in React „Virtual DOM“ und, da die direkte Manipulationen des DOM (wie ein Benutzer einen Wert oder einen jQuery-Plugin Ändern hören ein Element) werden von React unbemerkt. eindeutige und konstante Schlüssel führen dazu, dass React den DOM Knoten einer Komponente erneut generiert, wenn der Schlüssel nicht konstant ist (und nicht geparkten Status im Knoten verliert) oder einen DOM-Knoten wiederverwendet rendern Sie eine weitere Komponente, wenn der Schlüssel nicht eindeutig ist (und seinen Status an diese andere Komponente binden).

Sagt this Artikel. Aber es ist wirklich seltsam! Ich hoffe, dass jemand eine richtige Erklärung findet.

+0

Sieht so aus, seit das '' '' ''korrekt das Namensattribut aufruft. – Season

+0

@Saison Ja, genau mein Punkt! – Mihir

+0

Danke. Auch wenn das Attribut unzulässig ist, ist dieses Verhalten inkonsistent. Sieht aus, als wäre es ein Fehler, der in der neuesten Version von React behoben wurde. – jmak

0

Da div keine Reaktionskomponente ist, können Sie nur Requisiten übergeben, um Komponenten zu reagieren! Sie müssen lesen Sie mehr über Reagieren Prop, here ist Reagieren Requisiten Dokumente.

Verwandte Themen