この記事の内容は Vue2.6 の nextTick メソッドの解析に関するものです。必要な方は参考にしていただければ幸いです。
Vue 2.6 の nextTick メソッドの簡単な分析。
イベント ループ
JS の イベント ループ と タスク キュー は、実際、nextTick の概念を理解するための鍵です。
実際、このインターネット上にはそれを詳しく紹介した質の高い記事がたくさんあるので、簡単に読んでみました。
次の内容はブラウザ側 JS に適用されます。NodeJS のイベント ループ メカニズムは異なります。
仕様では、タスクが task(macrotask)
と microtask
の 2 つのカテゴリに分類されると規定されています。
通常 task
と見なされるタスク ソース:
1 2 3 4 5 |
|
通常 microtask
と見なされるタスク ソース:
1 2 3 4 |
|
簡単な概要: (これが公式の仕様です)
まず、実行コンテキスト スタックが空になるまで スクリプト script の実行を開始し、その後 ## のクリアを開始します。 #microtask queue タスクは先入れ先出しでキューに入れられ、それぞれが次々に実行され、タスクがクリアされた後にイベント ループが実行されます。
イベント ループ: タスク キューからタスクを継続的にフェッチし、実行のためにスタックにプッシュし、現在のタスクで実行します。ループ microtask queue 内のタスクを順番にクリアします。クリア後、ページ更新のレンダリングがトリガーされる場合があります (ブラウザーによって決定されます)。
イベント ループの手順を繰り返します。
nextTick
Vue のデータから DOM の更新されたレンダリングへの変更は、非同期プロセスです。このメソッドは、DOM 更新サイクルの終了後に遅延コールバックを実行するために使用されます。
使用方法は非常に簡単です:
1 2 3 4 5 6 7 8 9 10 11 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
|
非同期遅延関数です。ここで、Vue のバージョンごとに採用される戦略は実際には異なります。
2.6 バージョンでは、microtask を非同期遅延ラッパーとして使用することを優先します。
2.5 バージョンは、macrotask と microtask を組み合わせたものです。ただし、再描画前に状態が変化する場合 (#6813 など)、小さな問題が発生します。さらに、イベント ハンドラーで macrotask を使用すると、回避できない奇妙な動作が発生する可能性があります (#7109、#7153、#7546、#7834、#8109 など)。
つまり、2.6 バージョンは現在 microtask を使用していますが、これもなぜでしょうか。 。 2.4 以前のバージョンでも microtask を使用しているためです。 。 。
microtask microtask の優先順位が高く、イベントが一連のイベントで発生するため、場合によっては問題が発生します (#4521、 #6690 回避策) 同じイベントのバブリング中にも起動します (#6566)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
|
マイクロタスクの優先度。
約束 > MutationObserver > setImmediate > setTimeoutnextTick関数
nextTick 関数。 2 つのパラメータを受け入れます:
this は を指します。
$nextTick がさらにカプセル化され、 ctx は 現在の Vue インスタンス
に設定されます。1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
|
まとめ全体的に見ると、比較的わかりやすいと思います~ 2.6 このバージョンは、以前よりも少しシンプルになっています。
要約すると、Vue.nextTick(cb) が呼び出されるたびに何が行われるかになります。
cb 関数が処理され、 にプッシュされます。 callbacks array、
timerFunc 関数 を実行し、flushCallbacks 関数
の呼び出しを遅らせ、
callbacks 配列 内のすべての関数を走査して実行します。 遅延呼び出しの優先順位は次のとおりです: Promise > setImmediate >
実際、Vue 2.4、2.5、および 2.6 バージョンの nextTick 戦略は次のとおりです。若干異なります。 全体的に 2.6
2.4 は比較的似ています。 (よく見てください。基本的には同じです。2.6
timerFunc には setImmediate の判定が追加されています)2.5 バージョンは実際には似ています。 。 。ソース コードの書き方は少し異なります。 Promise > setTimeout >更新は v-on イベント ハンドラーでトリガーされ、nextTick は最初にマクロタスクを使用します。
以上がVue2.6のnextTickメソッドの解析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。