修改組件的狀態可以使用的一些方法:
1、比較常用的
this.setState({
message:"你好"
})
2、state更新是異步的時候
因為this.props和this.state可能是異步更新的,不能依賴他們的值去計算state,
this.setState({
count:this.state.count+this.props.count
})
我們不能通過上面的代碼得到想要的值,應該使用另一種setState()的形式,接受一個函數。這個函數的一個參數是前一個狀態(prevState),第二個參數是應用更新時的props,
第一種寫法:
this.setState((prevState,props)=>({count:prevState.count+props.count}))
第二種寫法:
this.setState((prevState,props)=>{return {count:prevState.count+props.count}})
3、執行setState()后能拿到最新的state 值嗎?
setState()函數接受兩個參數,一個是一個對象,就是設置的狀態,還有一個是一個回調函數,是在設置狀態成功之后執行的,所以我們可以通過回掉拿到最新的state值。
this.setState(
{ data: newData },
() => {
//這里打印的是最新的state值
console.log(that.state.data);
}
);
如果你希望在setState之前做些什么 可以使用前者的寫法:
this.setState((preState, props) => {
console.log(preState) //在改變state中的數據之前,打印出當前的state
return {auto: true}
}, () => console.log(this.state.auto));//在更新state之后,利用回調打印出this.state.auto
調用setState,組件的state並不會立即改變,setState只是把要修改的狀態放入一個隊列中,React會優化真正的執行時機,並且React會出於性能原因,可能會將多次setState的狀態修改合並成一次狀態修改。所以不要依賴當前的State,計算下個State。
例如:
function add() {
this.setState({count: this.state.count + 1});
this.setState({count: this.state.count + 1});
this.setState({count: this.state.count + 1});
}
直觀上來看,當上面的add函數被調用時,組件狀態的count值被增加了3次,每次增加1,那后count被增加了3,但是,實際上的結果state只增加了1。
原因是因為調用this.setState時,並沒有立即更改this.state,所以this.setState只是在反復設置同一個值而已,上面的code等同下面這樣的。
function add() {
const currentCount = this.state.count;
this.setState({count: currentCount + 1});
this.setState({count: currentCount + 1});
this.setState({count: currentCount + 1});
}
currentCount就是一個快照結果,重復地給count設置同一個值,不管重復幾次,得到的結果也只是增加1而已。
想要使最后的結果是3,實現代碼如下:
add = () => {
this.setState(prevState => ({
count: prevState.count + 1
}));
this.setState(prevState => ({
count: prevState.count + 1
}));
this.setState(prevState => ({
count: prevState.count + 1
}));
}
這樣,每次改變count時,都是prevState.count + 1,pervState是前一個狀態,當每次setState之后,前一個狀態都會改變,結果就是想要的3了。如果需要立即setState 那么就需要傳入一個函數來執行setState