{setC1((c)=>c+1);Promise.resolve().then(()=>{setC1((c)=>c+1);});};consthandleClick2=()=>{Promise.resolve().then">
84669 人が学習中
152542 人が学習中
20005 人が学習中
5487 人が学習中
7821 人が学習中
359900 人が学習中
3350 人が学習中
180660 人が学習中
48569 人が学習中
18603 人が学習中
40936 人が学習中
1549 人が学習中
1183 人が学習中
32909 人が学習中
rree
React18 バージョンでは、handleClickメソッドをクリックすると 2 つのレンダリングが発生するのに、handleClick2メソッドをクリックすると 1 つのレンダリングしか発生しないのはなぜですか?
handleClick
handleClick2
両方のメソッドの出力を同じにする必要があります。誰かがなぜ違うのか教えてもらえますか?
これらの呼び出しシーケンスがどのように異なるのか、また観察される動作がどのように起こり得るのかを説明します。
React が内部でどのようにステータスをバッチで更新するのか正確に説明することはできませんが、 私は、React には複雑な最適化があり、React を使用する開発者には無関係であり、React の内部構造の深い理解が必要であり、場合によってはバージョン間の変更さえも必要になると考えています。(お気軽に修正してください。)
新しいマイクロタスクを配置します。これは実際にはwindow.queueMicrotask()と同等です。
と同等です。
関数(おそらく)は、新しいマイクロタスクもスケジュールします。 したがって、それらのコールバック (PromiseとsetState) は同じ実行フェーズで呼び出されます。これら 2 つのバリエーションの違いは次のとおりです。
(おそらく)
setState
フックが 2 つの
関数の間で呼び出されます。
handleClickB
サンプルコード
ここで呼び出しシーケンスを説明します。
>):
ハンドルクリックA:
ハンドルクリックB:
ハンドルクリックB
個人的な解釈React は現在キューに入れられているすべての
つまり、updater 関数のみが呼び出されるときは常に、それらを一緒にバッチ処理してみてください。および
それらを一緒にバッチ処理してみてください。
最終状態を 1 回だけ更新します。ただし、新しいsetState関数が呼び出された場合、React は
を完了し、次のupdater定期関数を呼び出す前に新しいレンダリングを開始する可能性があります。 。なぜこれが行われるのかは推測することしかできません代码> 新しい
updater
代码> 新しい
が何らかの理由でバッチを壊す可能性があるため、または
呼び出しが再帰的に行われると、次のレンダリングが大幅に遅延するか、
(...またはこれはバグです。)
これらの呼び出しシーケンスがどのように異なるのか、また観察される動作がどのように起こり得るのかを説明します。
React が内部でどのようにステータスをバッチで更新するのか正確に説明することはできませんが、 私は、React には複雑な最適化があり、React を使用する開発者には無関係であり、React の内部構造の深い理解が必要であり、場合によってはバージョン間の変更さえも必要になると考えています。(お気軽に修正してください。)
###違い### Promise.resolve()新しいマイクロタスクを配置します。これは実際には
setStatewindow.queueMicrotask()
と同等です。
関数
handleClickA(おそらく)
は、新しいマイクロタスクもスケジュールします。 したがって、それらのコールバック (PromiseとsetState
) は同じ実行フェーズで呼び出されます。これら 2 つのバリエーションの違いは次のとおりです。
では、- setState2
updater
- 関数が順番に直接呼び出されます。
呼び出しシーケンスをよりわかりやすく説明するために、コードを少し書き直しました。
リーリーフックが 2 つの
updater関数の間で呼び出されます。
handleClickB
では、2 つのサンプルコード
呼び出しシーケンスの説明
ここで呼び出しシーケンスを説明します。
(
FIFO>):
ハンドルクリックA:
リーリー
リーリーハンドルクリックB
:個人的な解釈
updaterReact は現在キューに入れられているすべての
関数をバッチ処理しようとしていると思います。
つまり、updater 関数のみが呼び出されるときは常に、
はそれらを一緒にバッチ処理してみてください。
および最終状態を 1 回だけ更新します。ただし、新しいsetState関数が呼び出された場合、React は
現在の更新ループを完了し、次の
setStateupdater
定期関数を呼び出す前に新しいレンダリングを開始する可能性があります。 。なぜこれが行われるのかは推測することしかできません代码> 新しい
が何らかの理由でバッチを壊す可能性があるため、または
新しい- setState
React の担当者は、最適な最適化戦略とそのトレードオフをまだ模索中です。
呼び出しが再帰的に行われると、次のレンダリングが大幅に遅延するか、
(...またはこれはバグです。)