2017-07-02 1 views
0

Nach dem Lesen von Controlled Components und setState habe ich Probleme mit dem Aufbau eines kohärenten mentalen Modells von React.Warum funktionieren die gesteuerten Komponenten von React, obwohl setState asynchron ist

Das Beispiel einer Controlled-Komponente aus dem doc erwähnt, enthält Fragmente relevant zu meiner Frage folgenden:

handleChange(event) { 
    this.setState({value: event.target.value}); 
} 
render() { 
    return (
    <input type="text" value={this.state.value} onChange={this.handleChange}/> 
) 
} 

Die Frage ist: da der Benutzer beliebig bearbeiten Aktionen mit hohen Geschwindigkeit durchführen kann, und setState ist vermutlich asynchron, ist es möglich, dass im Moment t0, onChange wurde mit event.target.value='a' aufgerufen, was setState({ value: 'a'}) verursacht, dann im Moment t1 Benutzer ändert Text auf 'b', und im Moment t2, die "Warteschlange" Anfrage über setState tritt, und der Text wird durch einen veralteten Wert "a" ersetzt?

+0

Sie haben nur einen Benutzer, der gleichzeitig mit einer Komponente interagiert. Es kann natürlich sein, dass, wenn Werte von einer Datenbank kommen, dass diese Dinge auftreten, deshalb sollten Sie sicherstellen, dass wenn Sie Daten gemeinsam haben, dass das Speichern nur geschieht, wenn der Benutzer den neuesten Datensatz hat, in allen anderen Fällen 1 Komponente 1 Benutzer sollte anwenden – Icepickle

Antwort

0

Ich glaube, dass das korrekte mentale Modell für setState ein bisschen anders sein sollte, als ein vager Begriff "asynchron" evoziert. Es ist definitiv nicht wie setTimeout. Es ist mehr wie debounce in diesem neuen Aufruf von SetState überschreibt die vorherige. In dem Moment, in dem sich das Framework zum Ausführen von render entscheidet, ist sichergestellt, dass alle setState s, die bis zu diesem Zeitpunkt für dieses Steuerelement passiert sind, bereits zusammengeführt wurden. Zusammen mit der Annahme, dass jede Editieraktion bewirkt, dass onChang e synchron aufgerufen wird, bedeutet dies, dass zum Zeitpunkt des Aufrufs der Renderfunktion this.state.value gleich input.value ist.

+3

Sprechen Sie öffentlich mit sich selbst? : D – trixn

+0

Ist das ein Addendum zu deiner Frage, da es ein wenig "spekulativ" zu sein scheint;) – Icepickle

+0

Das ist grundsätzlich richtig; 'setState' wird mehr oder weniger sofort ausgeführt. Es wird erst ausgelöst, wenn die Funktion, die es aufgerufen hat, selbst ausgeführt wurde. Dies führt zu Verwirrung, da React-Entwickler manchmal vom Zustand lesen möchten, was sie gerade geschrieben haben. Aber das ist ein Problem mit einer einfachen Lösung. https://stackoverflow.com/questions/35867038/what-the-difference-of-this-state-and-this-setstate-in-reactjs/35868086#35868086 –

Verwandte Themen