2017-09-06 3 views
2

So weiß ich, dass staatliche Einstellung in Reaktion asynchron ist und alle und wir setzen Zustand wie folgt aus:Wie storniere ich einen `this.setState`?

this.setState(previousState => { 
    return { /* some new state that uses `previousState` */ } 
}); 

Also meine Frage ist: Wie kann ich eine this.setState stornieren? Nehmen wir an, ich verwende previousState, um festzustellen, dass ich kein Update rendern muss. Wie kann ich die setState abbrechen und sagen, dass React nichts rendern soll.

this.setState(previousState => { 
    if (/* previousState is fine */) { 
    // tell react not to do anything 
    } else { 
    return { /* some new state */ } 
    } 
}); 
+0

Wie würden Sie feststellen, dass Sie ein weiteres Update nicht brauchen? Meinst du, wenn sich der Staat nicht verändert hat? – Chris

+0

Warum sollte 'this.setState()' an erster Stelle aufgerufen werden? Klingt wie alles, was Sie tun müssen, ist 'this.state', dann * not * call' this.setState() ' –

+0

shouldComponentUpdate lifecycle ist, was Sie brauchen. Mögliches Duplikat von https://stackoverflow.com/questions/44521391/reactjs-stop-rerendering-on-a-particular-state-change-with-shouldcomponentupdat/44522755#44522755 –

Antwort

0

Entschuldigung für die Beantwortung meiner eigenen Frage hier, aber brandneue React 16 können Sie eine setState stornieren.

Der Aufruf von setState mit null löst kein Update mehr aus. Dies ermöglicht Ihnen, in einer Updater-Funktion zu entscheiden, ob Sie das Rendering durchführen möchten.

source

0

Vergleichen Sie die Zustände außerhalb von this.setState und je nachdem, ob es geändert wurde oder nicht, fire this.setState?

3

Das Idiom für "Erzähle reagieren, um nichts zu tun" ist "den vorherigen Zustand zurückgeben". Es liegt an der internen Verwaltung von React, festzustellen, dass es keine tatsächlichen Änderungen am DOM gibt und nichts für den Benutzer sichtbar ist. Insbesondere wird der Standardwert shouldComponentUpdate false zurückgeben, wenn die beiden Objekte identisch sind.

Das einzige, was Sie brauchen, ist:

return previousState;

Verwandte Themen