Home >Web Front-end >Front-end Q&A >When does react's setstate synchronize?

When does react's setstate synchronize?

藏色散人
藏色散人Original
2023-01-06 10:46:552158browse

React's setstate is "synchronous" in native events and setTimeout, but "asynchronous" in synthetic events and hook functions; in React, if it is an event triggered by React, call setState will not update "this.state" synchronously, and other setState calls will execute "this.state" synchronously.

When does react's setstate synchronize?

The operating environment of this tutorial: Windows 10 system, react18.0.0 version, Dell G3 computer.

When will react's setstate be synchronized? When is it asynchronous?

Give the answer first:

Sometimes it appears asynchronous, sometimes it appears synchronous.

setState is "asynchronous" only in synthetic events and hook functions, and is synchronous in native events and setTimeout.

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.setState is "asynchronous" only in synthetic events and hook functions, and is synchronous in native events and setTimeout.

2. The "asynchronous" of setState does not mean that it is internally implemented by asynchronous code. In fact, the execution process and code are all synchronous, but the calling sequence of synthetic events and hook functions is before updating.

As a result, the updated value cannot be obtained immediately in the synthetic event and hook function, forming the so-called "asynchronous". Of course, the updated value can be obtained through the callback in the second parameter setState(partialState, callback) result.

3. The batch update optimization of setState is also based on "asynchronous" (synthetic events, hook functions). There will be no batch updates in native events and setTimeout.

In "asynchronous" "If setState is performed multiple times on the same value, the batch update strategy of setState will overwrite it and take the last execution. If multiple different values ​​are setState at the same time, they will be merged and updated in batches during the update.

In React, if it is event processing triggered by React (such as event processing triggered by onClick), calling setState will not update this.state synchronously. Other setState calls will execute this synchronously. state. The so-called "in addition" refers to the event processing functions added directly through addEventListener, bypassing React, and the asynchronous calls generated through setTimeout/setInterval.

Reason:

In the implementation of React's setState function, a variable isBatchingUpdates will be used to determine whether to update this.state directly or put it in the queue and talk about it later, and isBatchingUpdates The default is false, which means that setState will update this.state synchronously. However, there is a function batchedUpdates. This function will change isBatchingUpdates to true. When React calls this batchedUpdates before calling the event processing function, the consequences are: That is, the event processing process setState controlled by React will not update this.state synchronously.

Please see https://github.com/LuNaHaiJiao/blog/issues/26

Recommended learning: "react video tutorial"

The above is the detailed content of When does react's setstate synchronize?. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn