3 回答

TA貢獻1934條經驗 獲得超2個贊
以下是React文檔所說的內容:
永遠不要
this.state
直接變異,因為之后調用setState()可能會替換你所做的變異。把this.state看作是不可變的。
setState()
不會立即改變this.state但會創建一個掛起狀態轉換。this.state
調用此方法后訪問可能會返回現有值。無法保證對setState的調用進行同步操作,并且可以對調用進行批處理以提高性能。
setState()
除非實現條件渲染邏輯,否則將始終觸發重新渲染shouldComponentUpdate()
。如果正在使用可變對象并且無法實現邏輯
shouldComponentUpdate()
,則setState()
僅在新狀態與先前狀態不同時調用將避免不必要的重新呈現。
以設計方式使用API總是明智的。如果文檔說不改變你的狀態,那么你最好不要改變你的狀態。
雖然setState()
技術上可能是異步的,但它肯定不會以任何明顯的方式變慢。組件的render()
功能將以非常短的順序調用。
直接設置狀態的一個缺點是陣營的生命周期方法- ,,shouldComponentUpdate()
-依賴于狀態轉換被調用。如果直接更改狀態并使用空對象調用,則無法再實現這些方法。componentWillUpdate()
componentDidUpdate()
setState()
setState()
另一個是它只是糟糕的編程風格。你在兩個陳述中做了你可以做的一個。
而且,這里沒有實際的好處。在這兩種情況下,render()
直到調用setState()
(或forceUpdate()
)之后才會觸發。
您聲稱有必要這樣做而不實際解釋需要的是什么。也許你想更詳細地解決你的問題??赡苡懈玫慕鉀Q方案。
最好使用框架而不是框架。
UPDATE
從下面的評論:
需要的是我想在下面使用改變的hasSubmit。
好的我現在明白了。如果您需要立即使用未來的州財產,最好的辦法就是將其存儲在本地變量中。
const hasSubmit = false;this.setState({ hasSubmit: hasSubmit});if (hasSubmit) { // Code that will use `hasSubmit` ...

TA貢獻1875條經驗 獲得超3個贊
如果要更改狀態并通過響應觸發重新渲染: 使用第二個代碼。
this.setState({ hasSubmit: false, });
第一個代碼的問題/錯誤:
this.state.hasSubmit = false // Updates state directly: // You are not supposed to do this // except in ES6 constructors this.setState({}) // passes an empty state to react. // Triggers re-render without mutating state
添加回答
舉報