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バージョンを実行する

推薦する

DockerコンテナがSongtiなどのフォントを認識しない場合の解決策

問題の背景: docker を使用してプロジェクトをデプロイする場合、プロジェクト内で印刷コントロー...

CentOS 7.x dockerはoverlay2ストレージ方式を使用する

/etc/docker/daemon.json を編集し、以下を追加します。 { "ストレ...

JS ES6 スプレッド演算子の魔法のような使い方

目次1. 属性を追加する2. 複数のオブジェクトを結合する3. オブジェクトのプロパティを削除する4...

MySQL での一時テーブルの使用例

ここ2日間ちょっと忙しくて、公式アカウントも数日更新が止まってしまいました。その結果、何人かの読者か...

Vue の計算プロパティの詳細な説明

目次補間式方法計算された要約する今日は、Vue の計算プロパティについてお話ししましょう。計算プロパ...

クラウドサーバーを購入し、Alibaba Cloud に Pagoda Panel をインストールする手順

アリババクラウドがサーバーを購入クラウドサーバーを購入し、サーバーバージョンとしてcentos 7....

Web ページ制作におけるテーブル属性 CellPad、CellSpace、Border の説明と使用

cellspacing は表内のセル間の距離です。セルパディングは、表のセル内の空白スペースです。一...

jQueryは要素を追加した後に元のイベントが実行されない問題を解決します

まずエラーコードを見てみましょう。 html: <テーブルボーダー="1"...

MySQL シリーズ 10 同時実行制御を実装するための MySQL トランザクション分離

目次1.同時アクセス制御2. 取引1. トランザクションは ACID 原則に従います。 2. トラン...

ウェブデザインの初心者に役立つ学習教材をいくつかお勧めします

勉強中に読んだ本についてもよく聞かれます。以下は初心者におすすめの本です(私が勉強中に読んだ本です。...

同じレベルの要素で Position:fixed と margin-top を一緒に使用する場合の CSS の問題

問題の説明CSS を使用して上部の固定効果を実現したいと思います。 margin-top と pos...

JavaScript の手ぶれ補正とスロットリングの説明

目次安定スロットリング要約する安定自動ドアは人を感知してドアを開け、5 秒間のカウントダウンを開始し...

docker+gitlab+gitlab-runnerの詳細なデプロイメント

環境サーバー: centos7クライアント: ウィンドウCentos7 に docker+gitla...

nginx httpモジュールのデータ保存構造の概要

このセクションから、http モジュールの実装原理について説明します。http モジュールで非常に重...

MySQL のテーブルリターンとインデックスカバレッジの例の詳細な説明

目次インデックスタイプインデックス構造非クラスター化インデックスクエリインデックスカバー要約するイン...