返回

React中的setState是同步还是异步?

前端


在React中,用于更新组件的状态。那么,它是同步还是异步的呢?

在React 16.8之前,是同步的。这意味着当您调用时,React会立即更新组件的状态,然后重新渲染组件。

class MyComponent extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      count: 0,
    };
  }

  handleClick() {
    // 同步更新状态
    this.setState({
      count: this.state.count + 1,
    });
  }

  render() {
    return (
      <div>
        <h1>Count: {this.state.count}</h1>
        <button onClick={this.handleClick}>+</button>
      </div>
    );
  }
}

这段代码中,当您点击按钮时,方法会被调用,该方法调用来更新组件的状态。然后,React会立即重新渲染组件,并在页面上显示更新后的计数。

然而,在React 16.8之后,不再是同步的了。这意味着当您调用时,React不会立即更新组件的状态。相反,它会将状态更新排入一个队列中,然后在稍后(通常是在下一帧)批量更新所有状态更新。

class MyComponent extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      count: 0,
    };
  }

  handleClick() {
    // 异步更新状态
    this.setState(prevState => ({
      count: prevState.count + 1,
    }));
  }

  render() {
    return (
      <div>
        <h1>Count: {this.state.count}</h1>
        <button onClick={this.handleClick}>+</button>
      </div>
    );
  }
}

这段代码中,当您点击按钮时,方法会被调用,该方法调用来更新组件的状态。但是,React不会立即更新组件的状态。相反,它会将状态更新排入一个队列中,然后在稍后(通常是在下一帧)批量更新所有状态更新。因此,您在页面上看到的计数不会立即更新。

为什么要将从同步改为异步呢?这是因为在某些情况下,同步更新状态可能会导致性能问题。例如,如果您在一个循环中多次调用,则可能会导致浏览器卡顿。

通过将改为异步,React可以将状态更新排入一个队列中,然后在稍后批量更新所有状态更新。这可以避免性能问题,并确保UI的流畅性。


在React中,用于更新组件的状态。在React 16.8之前,是同步的,这意味着当您调用时,React会立即更新组件的状态,然后重新渲染组件。而在React 16.8之后,不再是同步的了,而是异步的。这意味着当您调用时,React不会立即更新组件的状态,而是会将状态更新排入一个队列中,然后在稍后(通常是在下一帧)批量更新所有状态更新。将从同步改为异步是为了避免在某些情况下导致性能问题。