ホームページ >ウェブフロントエンド >jsチュートリアル >React の `setState` が状態を即座に更新しないのはなぜですか?

React の `setState` が状態を即座に更新しないのはなぜですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-09 20:06:16320ブラウズ

Why Doesn't React's `setState` Update the State Instantly?

setState 非同期: 状態を即座に更新しないのはなぜですか?

React アプリケーションでは、setState メソッドが非同期状態更新をトリガーし、更新された状態がすぐに期待される場合、混乱を招く可能性があります。この動作を理解することは、効果的な状態管理にとって重要です。

非同期の理由:

setState は、リソースを大量に消費する可能性のある再レンダリング プロセスを開始するため、非同期です。スムーズなユーザー エクスペリエンスを確保するために、React はこれらの更新をバッチ処理してパフォーマンスを最適化します。このバッチ動作により、大量の状態更新中に UI が応答しなくなるのを防ぎます。

結果:

setState を呼び出しても、状態は即座には更新されません。 setState 呼び出し後に this.state にアクセスすると、更新が完了するまで前の状態値が返される場合があります。この動作により、更新された状態にすぐに依存するコードで予期しない結果が発生する可能性があります。

コールバック メソッドの使用:

setState 呼び出し後に更新された状態にアクセスするには、React は次のことを推奨します。 2 番目の引数としてコールバック関数を使用します。このコールバックは、状態の更新が完全に処理された後にのみ実行され、最新の状態値へのアクセスが保証されます。

setState({ key: value }, () => {
  console.log('Updated state value:', this.state.key);
});

例:

次のコードを考えてみましょう。

class NightlifeTypes extends React.Component {
  handleOnChange = (event) => {  // Arrow function binds `this`
    const value = event.target.checked;

    if (event.target.className === "barClubLounge") {
      this.setState({ barClubLounge: value });
      // Console log will still print the old state value here

      // Use a callback to log the updated state value
      this.setState({ barClubLounge: value }, () => {
        console.log(value);
        console.log(this.state.barClubLounge);
      });
    }
  };
  render() {
    return (
      <input
        className="barClubLounge"
        type="checkbox"
        onChange={this.handleOnChange}
        checked={this.state.barClubLounge}
      />
    );
  }
}

ReactDOM.render(<NightlifeTypes />, document.getElementById("app"));

この例では、handleOnChange メソッド内のコンソール ログは、直後の状態にアクセスする場合との違いを示しています。 setState を使用し、コールバックを使用します。コールバックにより、コンソールは更新された状態値を正しく出力します。

React アプリケーションで状態を効果的に管理するには、setState の非同期の性質を理解することが不可欠です。コールバック メソッドを活用すると、予期しない動作を回避し、最新の状態値に適切にアクセスできるようになります。

以上がReact の `setState` が状態を即座に更新しないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。