react中的this.setState()


修改組件的狀態可以使用的一些方法:

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM