关于setState的一些问题,求老师帮忙解答下

来源:3-1 优化方案

Friday__

2017-05-25

是这样的 我知道setState是异步操作的,并且react有可能会合并几次setState,但是下面这段代码很想不明白

componentDidMount() {
    this.setState({
      value: this.state.value + 1,
    }, () => {
      console.log(this.state.value, '第一次回调执行完')
    });
    console.log(this.state.value);
    this.setState({
      value: this.state.value + 1,
    }, () => {
      console.log(this.state.value, '第二次回调执行完');
    });
    console.log(this.state.value);
    setTimeout(() => {
      console.log(this.state.value, '~~~~~~~~~~');
      this.setState({
        value: this.state.value + 1,
      }, () => {
        console.log(this.state.value, '第三次回调执行完')
      });
      console.log(this.state.value);
      this.setState({
        value: this.state.value + 1,
      }, () => {
        console.log(this.state.value, '第四次回调执行完')
      });
      console.log(this.state.value);
    }, 0)
  }
  
  /*
    0
    0
    1 "第一次回调执行完"
    1 "第二次回调执行完"
    1 "~~~~~~~~~~"
    2 "第三次回调执行完"
    2
    3 "第四次回调执行完"
    3  
  */

我是这么理解前面的,前面两次0是由于setState是异步操作,所以先执行的console,此时setState还没更新完,所以先打出了两次0,然后react合并了前两步setState操作,导致只执行了一次value+1,所以进入定时器开始时值是1,但是后面我就完全不懂了,为什么定时器中的setState的回调打印会先于直接console,而且这两步的setState为什么没有合并那

写回答

2回答

双越

2017-05-25

赞赞赞!

0
0

Friday__

提问者

2017-05-25

麻烦老师了,我找到答案了,https://www.bennadel.com/blog/2893-setstate-state-mutation-operation-may-be-synchronous-in-reactjs.htm

还有疑问的同学可以看这个文章,react对本身的类似onClick事件是异步的,但是类似setTimeout这种会同步执行,具体估计还是要看看react源码

0
0

React高级实战 打造大众点评Web App

已经对React Router4与Webpack2进行了项目升级

1711 学习 · 707 问题

查看课程