2017-06-19 88 views
-1

我有一個switch-case聲明類似於此。this.setState不立即更新,當基於當前狀態setState

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; 
} 

問題是它基於之前的狀態而不是當前的狀態設置狀態。

我該如何解決這個問題?

+4

'setState'是異步的。這不僅僅是一個直接的變化 - 它可以與其他呼叫的效率進行分組。改爲使用回調 - 第一個參數是之前的狀態。 – Li357

+1

我建議你重寫你的代碼。 'let someState; switch(this.state.someState){ case「string1」: someState =「string5」; 休息; } this.setState({someState:someState});' – Andrew

+0

這個用例正是設置狀態爲異步的原因。 React將後續調用合併爲一個更新。也許你不想回調,也許你想使用你之前設置的'someState'?例如,你可以從變量中獲得它嗎? – Sulthan

回答

0

我寫了幾個測試的情況下,原來的問題是其他地方。我正在使用這個switch-case來渲染不同的數據。如果數據與之前的數據相似,則React Native具有防止不必要的重新渲染的功能。顯然這包括反轉和排序原始數據數組。所以我返回了一個新的數據數組[].concat(),它的工作。

0

setState是異步的,所以如果你真的想這樣做,你應該有一個回調嘗試:

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

這不是我所說的「回調」。您可以使用'this.setState(prevState =>({someState:prevState.someState ===「string1」?「string5」),而不是使用開關來依賴以前的狀態:...}))'你只是試圖在異步操作之後中斷,這是沒有意義的。 – Li357

相關問題