1. 程式人生 > 其它 >react中setState同步、非同步問題

react中setState同步、非同步問題

class Example extends React.Component {
  constructor() {
    super();
    this.state = {
      val: 0
    };
  }
  
  componentDidMount() {
    this.setState({val: this.state.val + 1});
    console.log(this.state.val);    // 第 1 次 log

    this.setState({val: this.state.val + 1});
    console.log(this
.state.val); // 第 2 次 log setTimeout(() => { this.setState({val: this.state.val + 1}); console.log(this.state.val); // 第 3 次 log this.setState({val: this.state.val + 1}); console.log(this.state.val); // 第 4 次 log }, 0); } render() { return null; } };

1、第一次和第二次都是在 react 自身生命週期內,觸發時 isBatchingUpdates 為 true,所以並不會直接執行更新 state,而是加入了 dirtyComponents,所以列印時獲取的都是更新前的狀態 0。

2、兩次 setState 時,獲取到 this.state.val 都是 0,所以執行時都是將 0 設定成 1,在 react 內部會被合併掉,只執行一次。設定完成後 state.val 值為 1。

3、setTimeout 中的程式碼,觸發時 isBatchingUpdates 為 false,所以能夠直接進行更新,所以連著輸出 2,3。

輸出: 0 0 2 3