ホームページ > ウェブフロントエンド > jsチュートリアル > React の「setState」が非同期的に見えるのはなぜですか? 更新された状態がすぐに反映されるようにするにはどうすればよいですか?

React の「setState」が非同期的に見えるのはなぜですか? 更新された状態がすぐに反映されるようにするにはどうすればよいですか?

DDD
リリース: 2024-12-30 11:50:14
オリジナル
1048 人が閲覧しました

Why Does React's `setState` Appear Asynchronous, and How Can I Ensure Updated State is Immediately Reflected?

React の遅延状態更新: 非同期 setState について

React コンポーネントを操作する場合、setState メソッドの性質を理解することが重要です。状態の更新が即座に行われる命令型プログラミングとは対照的に、React の setState は非同期です。これは、状態の更新がコンポーネントの内部状態への即時反映を保証するものではないことを意味します。

問題のケース: Delayed BoardAdd Modal Show Flag

次のコードを考えてみましょう。 React で BoardAdd コンポーネントを実装するスニペット:

class BoardAdd extends React.Component {
    constructor(props) {
        super(props);
        this.state = {
            boardAddModalShow: false
        };
        this.openAddBoardModal = this.openAddBoardModal.bind(this);
    }

    openAddBoardModal() {
        this.setState({ boardAddModalShow: true });
        console.log(this.state.boardAddModalShow);
    }
}
ログイン後にコピー

When the openAddBoardModalメソッドが呼び出されると、boardAddModalShow フラグが true に設定され、その値がコンソールに出力されます。ただし、コンソール出力には、setState 呼び出しにもかかわらず値が false のままであることが示されます。

Why?

setState は非同期です。呼び出された後、React が再レンダリングをスケジュールするまで、UI は影響を受けません。 console.log ステートメントは、再レンダリングが行われる前に実行され、古い状態値が出力されます。

解決策: コールバックの使用

この問題を解決するには、次のようにします。 setState への引数としてコールバック関数を使用できます。コールバックは、状態が更新され、再レンダリングが行われた後に実行されます。

openAddBoardModal() {
    this.setState({ boardAddModalShow: true }, function () {
        console.log(this.state.boardAddModalShow);
    });
}
ログイン後にコピー

この場合、console.log ステートメントは状態が更新された後に実行され、新しい内容が正しく表示されます。 boardAddModalShow の値を true に設定します。

setState を作成する理由Asynchronous?

setState のこの非同期の性質は、パフォーマンス向上の目的に役立ちます。状態の更新により再レンダリングがトリガーされるため、状態の更新を同期するとブラウザーが応答しなくなる可能性があります。 setState 呼び出しをバッチ処理すると、不必要な再レンダリングが最小限に抑えられ、ユーザー エクスペリエンスが向上するため、パフォーマンスが向上します。

以上がReact の「setState」が非同期的に見えるのはなぜですか? 更新された状態がすぐに反映されるようにするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート