2016年10月4日 星期二

state 重點

1、和props不同,state不是由外部傳入,然後props一開始就存在,state則需要定義getInitialState方法並傳回一個物件,此物件會成為state物件,未初始化前讀取state是null

2、和props相同,可以在元件class說明物件(instructions)的任何屬性中使用

3、使用setState方法改變state屬性值,可局部改變,未被改變的部份保持原樣

現況
{
    hungry:false,
    mood:'great'
}

改變部份state
this.setState({
  hungry:true
});

改變後

{
   hungry:true,
   mood:'great'//維持原樣
}

4、不能在元件的render function中直接呼叫setState方法,原因如第5點

5、每次呼叫this.setState這個方法改變狀態值後,它都會自動呼叫render方法,以更新畫面

因此如果在render方法裡面直接呼叫它,它又會馬上呼叫render,render又呼叫它…會變成無窮迴圈

6、重置state的方法
在constructor 儲存一個重置用的備份
this.state = {
   a: 1,

   b: 2
};


this.baseState = this.state;

重置時:
this.setState(this.baseState);

這個方式能作用的原因為每次setState,react都是建立一個新的物件讓this.state參照

所以this.baseState和this.state在使用過setState之後就不是參照到到同一個物件了

7、傳入function到this.setState
https://codepen.io/anon/pen/dzMebJ
這個例子的差別在於雖然都是連續呼叫兩次this.setState
但BadCounter是整合後以後來的state做為結果做render,因其參考的this.state.count未變,所以兩次的結果相同,只+1。

GoodCounter以函數接受prevState,兩次呼叫間更新了state的值,但最後才做1次render。


沒有留言:

張貼留言