2017-06-19 3 views
-1

basiert Ich habe eine ähnliche Anweisung wie switch-case.this.setState wird nicht sofort aktualisiert, wenn setState auf den aktuellen Status

switch (this.state.someState) { 
    case "string1": 
    this.setState({ 
     someState: "string5" 
    }); 
    break; 
    case "string2": 
    this.setState({ 
     someState: "string6" 
    }); 
    break; 
    case "string3": 
    this.setState({ 
     someState: "string7" 
    }); 
    break; 
    case "string4": 
    this.setState({ 
     someState: "string8" 
    }); 
    break; 
    default: 
    this.setState({ 
     someState: "string1" 
    }); 
    break; 
} 

Das Problem ist, dass es den Status basierend auf dem vorherigen Zustand anstelle des aktuellen Status setzt.

Wie kann ich das beheben?

+4

'setState' ist asynchron. Es ist eher eine Anfrage als eine sofortige Änderung - es kann mit anderen Forderungen nach Effizienz kombiniert werden. Verwenden Sie stattdessen den Rückruf - das erste Argument ist der vorherige Zustand. – Li357

+1

Ich rate Ihnen, Ihren Code neu zu schreiben. 'lassen someState; switch (this.state.someState) { Fall "string1": someState = "string5"; Pause; } this.setState ({someState: someState}); ' – Andrew

+0

Dieser Anwendungsfall ist genau der Grund, warum der Einstellungsstatus asynchron ist. Reagieren führt nachfolgende Aufrufe zu einem Update zusammen. Vielleicht möchten Sie keinen Rückruf, vielleicht möchten Sie 'someState' verwenden, den Sie vorher eingestellt haben? Könnten Sie es zum Beispiel von einer Variablen bekommen? – Sulthan

Antwort

0

ich ein paar Testfälle geschrieben hat, stellt sich heraus, das Problem woanders war. Ich benutzte diese switch-case, um verschiedene Daten zu rendern. React Native verfügt über eine Funktion, die unerwünschtes erneutes Rendern verhindert, wenn die Daten den vorherigen Daten ähneln. Offensichtlich beinhaltet dies das Umkehren und Sortieren des ursprünglichen Datenarrays. Also habe ich ein neues Datenfeld mit [].concat() zurückgegeben und es hat funktioniert.

0

setState asynchron ist, also wenn Sie wirklich tun möchten, können Sie mit einem Rückruf versuchen sollte:

case "string1": 
    this.setState({ someState: "string5" },() => { 
     break; 
    }); 
+0

Das ist nicht, was ich mit "Rückruf" meinte. Anstatt einen Schalter zu verwenden, um sich auf den vorherigen Zustand zu verlassen (was eine schlechte Idee ist, weil * asynchron * ist, könnten Sie 'this.setState (prevState => ({someState: prevState.someState ===" string1 "?" String5 " : ...})) '. Sie versuchen gerade, nach einer asynchronen Operation zu brechen, was keinen Sinn macht. – Li357

Verwandte Themen