當你在一個對象對setState通過,反應會採取任何你傳遞,創建將跟蹤什麼傳入,然後將最終更新狀態的事件。正如文檔所說,如果運行多個setStates,反應可能將這些批處理集中在一起,並且由於它會異步發生,也就是在某個時刻,在運行第一個示例時,它可能會使用實際上是舊的並導致意外的this.state.counter
副作用。
第二個選項被認爲更安全,因爲它非常像一個承諾:當你傳遞一個函數時,一旦狀態已經被更新,React將只運行這個函數。這確保您每次更新時都使用正確的this.state.counter
變量,方法是使用它們提供的prevState
變量作爲回調的參數。
我沒有自己遇到過使用第一種方法的問題,但我也沒有嘗試一次性淹沒一堆setStates調用,我確信這是確實出現的時候。我看到這種犯規的主要方式是當他們試圖在設置狀態之後立即使用新狀態。
例如:
increaseCounter() {
this.setState({
counter: this.state.counter + this.props.increment,
});
// this will more then likely be the previous value
// as setState does not run right away, but asynchronously
this.useNewCounter(this.state.counter)
}
在比如,我們可以預期的是,當useNewCounter
被調用,它將採用最新的狀態,但它不會,參考仍將在以前的值,直到指出反應更新在調用此方法後的某個時刻的狀態。
他們的例子不完整。按原樣,當前標記爲「錯誤」的解決方案沒有錯。 – zerkms