当我们在 ReactJS 中使用 this.setState() 会发生什么?

IT技术 reactjs
2021-05-21 06:26:05

我对在 React 中使用 this.setState() 时状态实际何时发生变化感到困惑。这是我的 JSX:

var Hello = React.createClass({
  getInitialState: function () {
    return {
      iterator: 0
    }
  },
  handleClick: function () {
    console.log(this.state.iterator);
    this.setState({
      iterator: this.state.iterator + 1
    })
    console.log(this.state.iterator)
  },
  render: function () {
    return <button onClick={this.handleClick}>{this.state.iterator}</button>;
  }
});

ReactDOM.render(
  <Hello name="World"/>,
  document.getElementById('container')
);

如您所见,我正在记录调用 this.setState() 前后迭代器的状态。但是两次,它都记录了相同的数字。在我第一次单击按钮后,我希望分别记录 0 和 1,但它们都记录 0 和 0。第二次单击时,它们记录 1 和 1。那么状态何时实际发生变化以及究竟发生了什么这里?

1个回答

引用https://reactjs.org/docs/react-component.html#setstate

将其setState()视为更新组件请求而不是立即命令。为了更好的感知性能,React 可能会延迟它,然后一次更新多个组件。React 不保证立即应用状态更改。

setState() 并不总是立即更新组件。它可能会批量更新或推迟更新。这使得在调用 setState() 后立即读取 this.state 成为一个潜在的陷阱。相反,使用 componentDidUpdatesetState回调 ( setState(updater, callback))

第二个(可选)参数是一个回调函数,一旦 setState 完成并重新渲染组件,它将被执行:

this.setState({
    iterator: this.state.iterator+1
  }, function(){
    console.log(this.state.iterator) 
});