Wie zu zwingen, wieder aufstecken auf React-Komponenten?
Können sagen, ich habe eine view-Komponente, die eine bedingte render:
render(){
if (this.state.employed) {
return (
<div>
<MyInput ref="job-title" name="job-title" />
</div>
);
} else {
return (
<div>
<MyInput ref="unemployment-reason" name="unemployment-reason" />
<MyInput ref="unemployment-duration" name="unemployment-duration" />
</div>
);
}
}
MyInput sieht ungefähr so aus:
class MyInput extends React.Component {
...
render(){
return (
<div>
<input name={this.props.name}
ref="input"
type="text"
value={this.props.value || null}
onBlur={this.handleBlur.bind(this)}
onChange={this.handleTyping.bind(this)} />
</div>
);
}
}
Lässt sagen employed
wahr ist. Immer wenn ich schalten Sie ihn auf "false" und die andere Ansicht dargestellt wird, nur unemployment-duration
neu initialisiert wird. Auch unemployment-reason
wird vorbelegt mit dem Wert aus job-title
(wenn ein Wert gegeben wurde, bevor die Bedingung geändert).
Wenn ich das markup in der zweiten rendering-routine, so etwas wie dieses:
render(){
if (this.state.employed) {
return (
<div>
<MyInput ref="job-title" name="job-title" />
</div>
);
} else {
return (
<div>
<span>Diff me!</span>
<MyInput ref="unemployment-reason" name="unemployment-reason" />
<MyInput ref="unemployment-duration" name="unemployment-duration" />
</div>
);
}
}
Wie es scheint, funktioniert alles einwandfrei. Sieht aus wie Reagieren versagt zu diff 'job-Titel' und 'Arbeitslosigkeit-Grund'.
Mir bitte sagen, was ich falsch mache...
Was ist der
Ich konnte nicht angeben, dass die MyInput-Komponente macht den Eingang, eingewickelt in ein
und was ist mit
Sorry, ich Sprach zu früh. Im ersten Beispiel (ohne die "diff zu mir" span) die
für
data-reactid
auf jeder der MyInput
(oder input
, wie in DOM) Elemente auf, die vor und nach der employed
wechseln?Ich konnte nicht angeben, dass die MyInput-Komponente macht den Eingang, eingewickelt in ein
<div>
. Die data-reactid
Attribute scheint das anders zu sein sowohl auf der Verpackung div und das Eingabefeld. job-title
input bekommt-id data-reactid=".0.1.1.0.1.0.1"
, während unemployment-reason
input bekommt-id data-reactid=".0.1.1.0.1.2.1"
und was ist mit
unemployment-duration
?Sorry, ich Sprach zu früh. Im ersten Beispiel (ohne die "diff zu mir" span) die
reactid
Attribute identisch sind job-title
und unemployment-reason
wird, während im zweiten Beispiel (mit den diff-Bereich) Sie sind anders.für
unemployment-duration
die reactid
Attribut ist immer einzigartig.
InformationsquelleAutor o01 | 2016-03-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Was wahrscheinlich geschieht, ist, dass Reagieren denkt, dass nur ein
MyInput
(unemployment-duration
) ist, die zwischen den macht. Als solche, diejob-title
wird nie ersetzt mit derunemployment-reason
, das ist auch der Grund, warum die vordefinierten Werte sind vertauscht.Reagieren, wenn nicht das diff, es wird bestimmt, welche Komponenten neu sind und welche alt sind, basierend auf Ihren
key
Eigenschaft. Wenn kein solcher Schlüssel ist im code bereitgestellt, generiert es seine eigenen.Der Grund, warum der Letzte code-snippet, das Sie bieten funktioniert, weil Reagieren im wesentlichen zu ändern muss die Hierarchie aller Elemente, die unter der übergeordneten
div
und ich glaube, dass würde trigger ein neu-Rendern aller Kinder (das ist, warum es funktioniert). Hatte Sie Hinzugefügt, diespan
unten statt von oben, die Hierarchie der vorstehenden Elemente nicht ändern würde, und diese element würde nicht re-Rendern (und das problem würde weiterhin bestehen).Hier ist, was die offizielle Reagieren, Dokumentation sagt:
Sollten Sie in der Lage sein, dies zu beheben, indem Sie eine einzigartige
key
element sich entweder mit der übergeordnetendiv
oder alleMyInput
Elemente.Beispiel:
ODER
Wenn jetzt Reagieren tut das diff, wird sehen, dass die
divs
anders sind und re-Rendern einschließlich aller seiner " Kinder (1. Beispiel). Im 2. Beispiel, das diff wird ein Erfolg aufjob-title
undunemployment-reason
da Sie nun verschiedene Schlüssel haben.Können Sie natürlich auch alle Schlüssel, die Sie wollen, solange Sie eindeutig sind.
Update August 2017
Für einen besseren Einblick in die Funktionsweise der Tasten Reagieren, empfehle ich das Lesen meiner Antwort auf Verständnis eindeutiger Schlüssel in React.js.
Update November 2017
Sollte dieses update habe geschrieben eine Weile her, aber mit string-literalen in
ref
ist jetzt veraltet. Zum Beispielref="job-title"
sollten nun statt dessen werdenref={(el) => this.jobTitleRef = el}
(zum Beispiel). Siehe meine Antwort auf Deprecation Warnung mit diesem.refs für mehr info.Froh konnte ich helfen.
it will determine which components are new and which are old based on their key property.
- das war... Schlüssel... zu meinem VerständnisIch sehe, was du da gemacht hast...
Vielen Dank ! Ich hatte auch herausgefunden, dass alle Kinder, die Komponenten aus einer Karte wurden erfolgreich neu gerendert, und ich konnte nicht verstehen, warum.
InformationsquelleAutor Chris
Ändern, die Taste der Komponente.
Komponente deaktiviert und eine neue Instanz der Komponente montiert werden, da der Schlüssel sich geändert hat.
Bearbeiten: Dokumentiert auf Sie Wahrscheinlich nicht Brauchen Abgeleiteten Zustand:
Vereinbart. Froh, dass es geholfen hat.
dito ersten Kommentar zu dieser Antwort 😀
Präzise und auf den Punkt. Danke @AlexKinnee!
Gut, das mir sehr viel geholfen! danke! Ich musste zurücksetzen, CSS-animation, aber der einzige Weg das zu tun ist, zu zwingen, eine re-Rendern. Ich Stimme zu, dass dies sollte deutlicher werden in der Dokumentation reagieren
InformationsquelleAutor Alex K
Verwenden
setState
Ihrer Ansicht zu ändernemployed
Eigentum des Staates. Dieses ist zum Beispiel Reagieren render-engine.'beschäftigt' variable sollte sein Eigentum der Staat Reagieren. Es ist nicht offensichtlich in deinem code-Beispiel.
Ich finde es schon ist?
wie wollen Sie dies ändern.Zustand.beschäftigt? Zeigen Sie den code, bitte. Sind Sie sicher, dass Sie setState in der richtigen Stelle in Ihrem code?
Die view-Komponente ist ein bisschen komplizierter als mein Beispiel zeigt. Zusätzlich zu den MyInput-Komponenten, ist es auch renderes eine radiobutton-Gruppe, die steuert, den Wert von 'beschäftigt' mit einem onChange-handler. In das onChange-handler, habe ich die view-Komponente ist-Zustand entsprechend. Die view neu gerendert in Ordnung, wenn der Wert des radiobutton-Gruppe ändert, sondern Reagieren meint, die ersten MyInput-Komponente ist die gleiche wie vorher 'beschäftigt' geändert.
InformationsquelleAutor Dmitriy