Vue nextTickの原理の分析

Vue nextTickの原理の分析

Vue を使用したことがある人は、Vue の nextTick で更新された DOM を取得できることをご存知でしょう。今日は nextTick が何をするのかを説明します。

始める前に、イベント ループという概念を知っておく必要があります。

イベントループ

イベント ループは、イベント ループとして翻訳されます。イベント ループには、1 つ以上のタスク キューが含まれます。継続スレッドは、キューから最も早いタスクを取り出して実行します。取り出されたタスクは、macroTask と呼ばれます。各 macroTask にはタスク ソースがあります。各 macroTask が処理された後、次に早い macroTask がキューから取り出され、再実行されます。

タスクソース:

「」
    1. スクリプト
    2. イベント 3. DOM の相互作用 4. I/O
    5. UIレンダリング
    6.タイムアウトを設定する
    7. 間隔を設定する
    8. アニメーションフレームをリクエストする
    .....
「」

つまり、上記のような状況が発生すると、macroTask が生成され、キューにプッシュされます。

miscroTask (マイクロタスク)

各マクロタスクを実行した後、メインスレッドはマクロタスクの下のマイクロタスクが空かどうかを確認します。空でない場合は、早いものから遅いものへと時系列順に取り出されます。途中で新しいマイクロタスクに遭遇した場合は、マイクロタスクをマイクロタスクキューにプッシュし続けます。

UI レンダリング (重要なポイント)

miscroTask キューがクリアされると、メインスレッドは UI Render を実行します。つまり、インターフェイスをレンダリングします。ただし、ブラウザは UI Render タスクで毎回インターフェイスをレンダリングするとは限りません。状況によって異なります。現在主流のブラウザは、一般的に 60HZ、つまり 16.7ms のリフレッシュ レートでレンダリングします (正確な推定値ではありません)。macroTask は通常 16.7ms 未満であるため、ブラウザは毎回状況に応じてレンダリングします。

次のサイクルをまとめる

1. マクロタスクキューから最も早く追加されたタスクを取り出す
2. タスクの実行を開始します。プロセス中に新しい macroTask が検出されると、macroTask キューの最後に追加されます。
3. マクロタスクを実行した後、イベントループはマイクロタスクキューを探します。
4. 同様に、途中で新しい microTask に遭遇した場合、それは macroTask の下の microTask キューの最後に配置されます。
5. microTaskを実行した後、UI Render macroTaskが実行されます。
6. ブラウザは現在の状況に基づいてDOMを更新するかどうかを決定します。通常は60Hzの頻度で行われます。
7. この時点でイベントループは終了する

次のチェック

nextTickの分析を開始します

上の図によると、nextTick を書く方法はいくつかあります。

    1. this.$nextTick(cb)
    2. this.$nextTick().then(cb)

すべてのcbはコールバック配列に入れられ、1回限りの呼び出しを待ちます。上の図では、コールバックが主にtimerFunc関数によって呼び出されていることがわかります。以下でこの関数に注目してみましょう。まず、ソースコードを見てみましょう。

timerFuncは状況に応じて異なる割り当てを持つことがわかります。

まず、ブラウザが promise 属性をサポートしているかどうかを判断します。サポートしている場合は、timerFunc が Promise に割り当てられます。ここで小さな問題があります。つまり、iOS では、Promise オブジェクトがあり、microTask キューにプッシュされますが、キューは更新されません。このとき、microTask キューを強制的に更新するには、macroTask を追加する必要があります。

MutationObserver、このAPIを知らない人も多いと思いますが、これはDOMの変更を監視できるAPIで、microTaskに属し、Promiseよりも優先度が低いです。新しいテキストノードを作成した後、手動でテキストノードを変更してmicroTaskをトリガーします。

ここで小さな問題があります:

テキストノードが正常にレンダリングされた場合、他の DOM レンダリングも成功することを意味しますか?

これは代替ソリューションであり、主にマイクロタスクであるため、DOMを監視するためではなく使用されます。

すべてのマイクロタスクが失敗した後、次善の策は setImmediate を選択することです。これは、高バージョンの IE および Edge ブラウザにのみ搭載されている可能性のある API です。主に大量のデータを計算するときに使用されます。

最後に、setTimeout

これを読んで、何か疑問はありましたか?

上記のコードは、DOM の更新をリッスンした後に nextTick が実行されることを示していませんか?何だって???その瞬間、頭が真っ白になった。

次に最も重要なのは

DOM ツリーはリアルタイムで更新されます。 DOM ツリーはリアルタイムで更新されます。 DOM ツリーはリアルタイムで更新されます。 これを 3 回繰り返します。これは、DOM の更新を監視する必要がないことを意味します。 DOM に対する操作はリアルタイムのフィードバックを得ることができます。 前のコード行で DOM を操作し、次の行でそれを取得します。

すると、nextTick はいったい何をするのだろうと混乱する人もいるでしょう。

nextTick の役割は、キューからコレクション Watcher を 1 つずつ取り出し、データを変更して DOM を一度にレンダリングすることです。DOM を操作するコストが高いことはわかっています。ブラウザーが Web ページを開くと、スレッドで構成されるプロセスが開始されます。

1. GUIレンダリングスレッド
2. js エンジン スレッド (メイン スレッド)
3. EventLoop トレーニング スレッド
4. ネットワークなどのその他のスレッド

クロススレッド操作はコストがかかるため、DOM を一度にレンダリングすると、パフォーマンスを効果的に最適化できます。 !

要約する

NextTick は、DOM の変更をリアルタイムで取得できるため、DOM の変更を監視するために使用されません。その機能は、データを一度変更して DOM をレンダリングすることです。

以上がVue nextTickの原理の詳細な分析です。Vue nextTickの原理の詳細については、123WORDPRESS.COMの他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • Vue における nextTick の役割といくつかの簡単な使用シナリオ
  • Vue の nextTick の簡単な分析
  • Vue の $nextTick の包括的な分析
  • VUE は DOM を非同期的に更新します - $nextTick を使用して DOM ビューの問題を解決します
  • Vue.js 原理分析: nextTick 実装の詳細説明
  • Vue における this.$nextTick の機能と使用方法
  • Vue での $nextTick と $forceUpdate の使い方の詳細な説明
  • Vue nextTick の使い方と原理の詳細な研究
  • Vue での NextTick の使用例
  • Vue ソースコード nextTick の使用法と原理分析
  • Vue の nextTick について 1 つの記事で学ぶ
  • ブラウザイベントループとvue nextTicketの実装
  • Vue での $nextTick の使い方の説明
  • ソースコードからvueのnextTickの使い方を理解する
  • Vue2.0$nextTickは、データのレンダリングが完了した後にコールバック関数メソッドをリッスンします。
  • DOM を操作する際の vue ディレクティブと $nextTick の違いの詳細な説明
  • Vue nextTick メカニズムの詳細な理解
  • Vue の nextTick について話す

<<:  MySQL 5.7.20 共通ダウンロード、インストール、設定方法と簡単な操作スキル(解凍版無料インストール)

>>:  Dockerを使用してサーバー上で複数のPHPバージョンを実行する

推薦する

モバイルウェブサイトの開発に関するいくつかの結論

ウェブサイトのモバイル版には、少なくともいくつかの基本機能が必要です。 1. ページの適用性の問題:...

SpringBootをDockerにデプロイし、jarパッケージを置き換える方法の詳細な説明

目次プロジェクトディレクトリDockerファイルファイルの展開画像を生成するコンテナを起動するウェブ...

JS 実用的なオブジェクト指向スネークゲームの例

目次考える1. 貪欲な蛇の効果画像2. スネークの分析2.1 ゲーム開始機能2.2 運動機能2.2....

Ubuntu 18.04 での Pycharm インストール チュートリアルの実装

方法1: Pycharmをダウンロードしてインストールするダウンロードアドレス: https://w...

Vueのフィルターとディレクティブの詳細な説明

目次vueカスタムディレクティブグローバル指令ローカル指示使用フック関数(両方ともオプション)使用方...

MySQL 5.7.18 でパスワードを変更する方法

MySQL 5.7.18 でパスワードを変更する方法: 1. まずMySQLサーバーをシャットダウン...

JavaScript は単一のリンクリストプロセス分析を実装します

序文:複数の要素を格納するために、配列は最も一般的に使用されるデータ構造ですが、配列には多くの欠点も...

マインスイーパゲームを実装するための jQuery プラグイン (1)

この記事では、jQueryプラグインを使用したマインスイーパゲームの最初の記事の具体的なコードを参考...

HTML テーブル タグ チュートリアル (31): セルの幅と高さの属性 WIDTH、HEIGHT

デフォルトでは、セルの幅と高さはコンテンツに応じて自動的に調整されますが、セルの幅と高さを手動で設定...

mysqlは時間を自動的に追加し、時間を自動的に追加および更新する操作を実装します

時間フィールドは、データベースの使用時によく使用されます。よく使われるのは作成時間と更新時間です。し...

HTML チュートリアル: よく使われる HTML タグのコレクション (5)

関連記事:初心者が学ぶ HTML タグ (4)導入された HTML タグは、必ずしも XHTML 仕...

Windows での MySQL 8.0.15 のインストールと設定方法のグラフィック チュートリアル

この記事では、参考までにMySQL 8.0.15のインストールと設定方法のグラフィックチュートリアル...

Docker で Ubuntu に Python3 と Pip をインストールする際の問題

文章1) Ubuntuイメージをダウンロードする docker プル Ubuntu 2) 画像を見る...

MySQL での select、distinct、limit の使用

目次1. はじめに2. 選択2.1 単一列のクエリ2.2 複数の列のクエリ2.3 すべての列をクエリ...

IEのクラッシュバグ

コードをコピーコードは次のとおりです。 <スタイル タイプ="text/css&qu...