rree
React18 バージョンでは、handleClick
メソッドをクリックすると 2 つのレンダリングが発生するのに、handleClick2
メソッドをクリックすると 1 つのレンダリングしか発生しないのはなぜですか?
両方のメソッドの出力を同じにする必要があります。誰かがなぜ違うのか教えてもらえますか?
P粉6429205222023-09-08 17:06:21
これらの呼び出しシーケンスがどのように異なるのか、また観察される動作がどのように起こり得るのかを説明します。
React が内部でどのようにステータスをバッチで更新するのか正確に説明することはできませんが、 私は、React には複雑な最適化があり、React を使用する開発者には無関係であり、React の内部構造の深い理解が必要であり、場合によってはバージョン間の変更さえも必要になると考えています。 (お気軽に修正してください。)
###違い### Promise.resolve() 新しいマイクロタスクを配置します。これは実際には window.queueMicrotask()
と同等です。
関数 (おそらく)
は、新しいマイクロタスクもスケジュールします。
したがって、それらのコールバック (Promise と setState
) は同じ実行フェーズで呼び出されます。
これら 2 つのバリエーションの違いは次のとおりです。
フックが 2 つの
updater 関数の間で呼び出されます。
handleClickB
では、2 つの
サンプルコード
ここで呼び出しシーケンスを説明します。
>):
リーリーハンドルクリックB
:
個人的な解釈
React は現在キューに入れられているすべての
つまり、updater 関数のみが呼び出されるときは常に、 それらを一緒にバッチ処理してみてください。
および
最終状態を 1 回だけ更新します。 ただし、新しい setState 関数が呼び出された場合、React は
現在の更新ループ を完了し、次の updater
定期関数を呼び出す前に新しいレンダリングを開始する可能性があります。 。
なぜこれが行われるのかは推測することしかできません
代码> 新しい
が何らかの理由でバッチを壊す可能性があるため、または
呼び出しが再帰的に行われると、次のレンダリングが大幅に遅延するか、
(...またはこれはバグです。)