目次
## を提供してくれました。 #実際、$nextTick
ホームページ ウェブフロントエンド Vue.js Vue.$nextTick をより深く理解できるようにします (原理の簡単な分析)

Vue.$nextTick をより深く理解できるようにします (原理の簡単な分析)

Mar 01, 2023 pm 08:03 PM
フロントエンド vue.js $nexttick

この記事では、Vue の純粋な情報を共有し、あまり知られていない Vue.nextTick の紹介と、Vue.$nextTick の原理について説明します。

Vue.$nextTick をより深く理解できるようにします (原理の簡単な分析)

原則的なものにはさらに多くの単語が含まれます。辛抱強くじっくり味わってください。

Vue の DOM 更新メカニズム

目標を達成するために Vue を積極的に使用していると、突然、このデータは明らかに変更しましたが、取得したときにはそれが最後の値であることに気づきます (私は怠け者です。具体的な例はありませんか?)

このとき、Vue は次のように言います: 「小さい、あなたはこれを理解していません。私の DOM は非同期で更新されます!!!」

簡単に言うと、Vue の応答性は DOM が更新されることを意味するものではありません。データ変更直後に変更されますが、特定の戦略に従って DOM が更新されます。この利点は、DOM に対する不必要な操作を回避し、レンダリングのパフォーマンスを向上できることです。 [関連する推奨事項: vuejs ビデオ チュートリアル Web フロントエンド開発 ]

については、Vue の公式ドキュメントで説明されています:

おそらくまだ気づいていないかもしれませんが、Vue は DOM 更新を非同期的に実行します。データ変更が観察される限り、Vue はキューを開き、同じイベント ループ内で発生するすべてのデータ変更をバッファーに入れます。同じウォッチャーが複数回トリガーされた場合、キューにプッシュされるのは 1 回だけです。バッファリング中のこの重複排除は、不必要な計算や DOM 操作を回避するために非常に重要です。次に、次のイベント ループ「ティック」で、Vue はキューをフラッシュし、実際の (重複排除された) 作業を実行します。

率直に言うと、これは実際には JS のイベント ループと密接に関連しています。つまり、Vue はすべてのデータ変更をレンダリングすることはできません。最初にこれらの変更を非同期キューに入れます。また、キュー内の操作も重複排除されます。たとえば、データを 3 回変更した場合、最後のデータのみが保持されます。これらの変更はキューの形式で保存できますが、ここで問題は、イベント ループのどの時点で Vue が DOM を変更するかということです。

Vue には 2 つのオプションがあります。1 つはこのイベント ループの最後で DOM を更新することで、もう 1 つは DOM の更新をイベント ループの次のラウンドに入れることです。このとき、You Yuxi は胸をなでて、「私には両方の方法があります!」と言いました。しかし、このラウンドのイベント ループの最終実行は次のラウンドのイベント ループよりもはるかに高速であるため、Vue は最初の方法を優先します。 2 番目のメカニズムは、環境がサポートしていない場合にのみトリガーされます。 (?? で始まるリンクはイベント ループを理解するのに役立ちます)

パフォーマンスは大幅に改善されましたが、この時点で問題が発生します。イベント ループのラウンドでは、同期実行スタックが完了すると、非同期キューの内容が実行されるため、DOM を取得する操作は同期です。 !データを変更したものの、その更新は非同期であり、データを取得した時点では変更する時間がないため、記事冒頭の問題が発生するということではないでしょうか。 ######これ。 。 。どうしてもこれをしなければならないのですが、どうすればよいでしょうか? ?

それは問題ではありません。Youda は非常に思慮深く私たちに

Vue.$nextTick()

Vue.$nextTick()

## を提供してくれました。 #実際、$nextTick

は一文で明確に説明できます。

$nextTick に入力した操作はすぐには実行されず、データの更新と DOM を待ちます。更新が完了してから実行すると、確実に最新のものが取得されます。 より正確には、$nextTick

メソッドは、次の DOM 更新サイクルまでコールバックを遅らせます。 (この文が理解できない場合は、上の [犬の頭] を読んでください)

の意味は誰もが理解していますが、$nextTick

はどのようにしてこの魔法の機能を実現するのでしょうか?コアは次のとおりです:

Vue
内部的には、ネイティブの

Promise.thenMutationObserver、および setImmediate を使用しようとします。非同期キュー 、実行環境がサポートしていない場合は、代わりに setTimeout(fn, 0) が使用されます。 この文を注意深く見てみると、これは JavaScript の非同期コールバック タスク キューを使用して、Vue フレームワークに独自の非同期コールバック キューを実装しているだけではないことがわかります。これは、実際には、基礎となる JavaScript 実行原則を特定のケースに適用する典型的な例です。

ここで少し要約してみましょう:

$nextTick

コールバック関数をマイクロタスクまたはマクロタスクに入れて、その実行順序を遅らせます; (要約も遅延しますか?)

ソース コード内の 3 つのパラメーターの意味を理解することが重要です:

  • callback: 実行したい操作をこの関数に入れることができます。$nextTick を一度実行しないと、コールバック関数は非同期キューに入れられます。
  • pending: イベント ループへの参加が初めてであるかどうかを判断するために使用される ID。キュー マウントの非同期実行は、初めて追加された場合にのみトリガーされます。
  • timerFunc: usedコールバック関数の実行をトリガーします。つまり、Promise.then または MutationObserver または setImmediate または setTimeout
##プロセスを理解した後、

$nextTick の実行プロセス全体を見ると、実際には $nextTick のコールバック関数を 1 つずつコールバック キューにプッシュすることになります。その後、イベントの性質に従って順番が来るまで実行を待ちます。実行する場合は、それを実行してから、コールバック キュー内の対応するイベントを削除します。

使用方法

ここまで述べましたが、どのように使用するのでしょうか?非常に単純、非常に単純です

mounted: function () {
  this.$nextTick(function () {
    // Code that will run only after the
    // entire view has been rendered
  })
}
ログイン後にコピー

使用シナリオ

  • 作成された DOM を取得する操作には、それを使用する必要があります

  • は上記の例です。最新の値を取得したい場合は、それを使用してください。

  • 使用プロセス中に使用されるサードパーティのプラグインもいくつかあり、特定の

  • #参考
フロントエンドの高度なインタビューの質問に対する詳細な回答

補足

質問を理解する前に実行できませんでした。

$nextTick

渡されたメソッドはマイクロタスクになっているのですが、他のマイクロタスクとの実行順序はどうなるのでしょうか? これは単に、誰が

Promise

オブジェクトを最初にマウントするかという問題です。$nextTick メソッドが呼び出されると、そのクロージャ内に保持されている実行キューがマウントされます。 Promise オブジェクトにロードされた Vue は、データが更新されると、まず $nextTick メソッドを内部で実行し、次に実行キューを ## にマウントします。 #お約束実際、オブジェクト上では、JsEvent Loop モデルを理解した後、データ更新も $nextTick# の呼び出しとみなされます。 ## メソッドと $nextTick メソッドはプッシュされたすべてのコールバックを一度に実行するため、実行順序 の問題と $nextTick の違いを理解できます。および

nextTick

つまり、nextTick には、コンテキストを指定する追加のコンテキスト パラメーターがあります。しかし、この 2 つの本質は同じです。$nextTick はインスタンス メソッドであり、nextTick はクラスの単なる静的メソッドです。インスタンス メソッドの利点の 1 つは、次のとおりです。呼び出し元のインスタンスに自動的にバインドされます。これは this だけです。 (学習ビデオ共有: vuejs 入門チュートリアル

基本プログラミング ビデオ

)

以上がVue.$nextTick をより深く理解できるようにします (原理の簡単な分析)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

PHP と Vue: フロントエンド開発ツールの完璧な組み合わせ PHP と Vue: フロントエンド開発ツールの完璧な組み合わせ Mar 16, 2024 pm 12:09 PM

PHP と Vue: フロントエンド開発ツールの完璧な組み合わせ 今日のインターネットの急速な発展の時代において、フロントエンド開発はますます重要になっています。 Web サイトやアプリケーションのエクスペリエンスに対するユーザーの要求がますます高まっているため、フロントエンド開発者は、より効率的で柔軟なツールを使用して、応答性の高いインタラクティブなインターフェイスを作成する必要があります。フロントエンド開発の分野における 2 つの重要なテクノロジーである PHP と Vue.js は、組み合わせることで完璧なツールと見なされます。この記事では、PHP と Vue の組み合わせと、読者がこれら 2 つをよりよく理解し、適用できるようにするための詳細なコード例について説明します。

フロントエンドの面接官からよく聞かれる質問 フロントエンドの面接官からよく聞かれる質問 Mar 19, 2024 pm 02:24 PM

フロントエンド開発のインタビューでは、HTML/CSS の基本、JavaScript の基本、フレームワークとライブラリ、プロジェクトの経験、アルゴリズムとデータ構造、パフォーマンスの最適化、クロスドメイン リクエスト、フロントエンド エンジニアリング、デザインパターン、新しいテクノロジーとトレンド。面接官の質問は、候補者の技術スキル、プロジェクトの経験、業界のトレンドの理解を評価するように設計されています。したがって、候補者はこれらの分野で自分の能力と専門知識を証明するために十分な準備をしておく必要があります。

フロントエンド開発に Go 言語を使用するにはどうすればよいですか? フロントエンド開発に Go 言語を使用するにはどうすればよいですか? Jun 10, 2023 pm 05:00 PM

インターネット技術の発展に伴い、フロントエンド開発の重要性がますます高まっています。特にモバイル デバイスの人気により、効率的で安定しており、安全で保守が容易なフロントエンド開発テクノロジーが必要です。 Go 言語は、急速に発展しているプログラミング言語として、ますます多くの開発者によって使用されています。では、フロントエンド開発に Go 言語を使用することは可能でしょうか?次に、この記事ではフロントエンド開発にGo言語を使用する方法を詳しく説明します。まずはフロントエンド開発にGo言語が使われる理由を見てみましょう。多くの人は Go 言語は

C# 開発経験の共有: フロントエンドとバックエンドの共同開発スキル C# 開発経験の共有: フロントエンドとバックエンドの共同開発スキル Nov 23, 2023 am 10:13 AM

C# 開発者としての私たちの開発作業には、通常、フロントエンドとバックエンドの開発が含まれますが、テクノロジーが発展し、プロジェクトが複雑になるにつれて、フロントエンドとバックエンドの共同開発はますます重要かつ複雑になってきています。この記事では、C# 開発者が開発作業をより効率的に完了できるようにする、フロントエンドとバックエンドの共同開発テクニックをいくつか紹介します。インターフェイスの仕様を決定した後、フロントエンドとバックエンドの共同開発は API インターフェイスの相互作用から切り離せません。フロントエンドとバックエンドの共同開発をスムーズに進めるためには、適切なインターフェース仕様を定義することが最も重要です。インターフェイスの仕様にはインターフェイスの名前が含まれます

Django はフロントエンドですか、バックエンドですか?それをチェックしてください! Django はフロントエンドですか、バックエンドですか?それをチェックしてください! Jan 19, 2024 am 08:37 AM

Django は、迅速な開発とクリーンなメソッドを重視した Python で書かれた Web アプリケーション フレームワークです。 Django は Web フレームワークですが、Django がフロントエンドなのかバックエンドなのかという質問に答えるには、フロントエンドとバックエンドの概念を深く理解する必要があります。フロントエンドはユーザーが直接対話するインターフェイスを指し、バックエンドはサーバー側プログラムを指し、HTTP プロトコルを通じてデータと対話します。フロントエンドとバックエンドが分離されている場合、フロントエンドとバックエンドのプログラムをそれぞれ独立して開発して、ビジネス ロジックとインタラクティブ効果、およびデータ交換を実装できます。

Go 言語のフロントエンド テクノロジーの探求: フロントエンド開発の新しいビジョン Go 言語のフロントエンド テクノロジーの探求: フロントエンド開発の新しいビジョン Mar 28, 2024 pm 01:06 PM

Go 言語は、高速で効率的なプログラミング言語として、バックエンド開発の分野で広く普及しています。ただし、Go 言語をフロントエンド開発と結びつける人はほとんどいません。実際、フロントエンド開発に Go 言語を使用すると、効率が向上するだけでなく、開発者に新たな視野をもたらすことができます。この記事では、フロントエンド開発に Go 言語を使用する可能性を探り、読者がこの分野をよりよく理解できるように具体的なコード例を示します。従来のフロントエンド開発では、ユーザー インターフェイスの構築に JavaScript、HTML、CSS がよく使用されます。

フロントエンドにインスタントメッセージングを実装する方法 フロントエンドにインスタントメッセージングを実装する方法 Oct 09, 2023 pm 02:47 PM

インスタント メッセージングを実装する方法には、WebSocket、ロング ポーリング、サーバー送信イベント、WebRTC などが含まれます。詳細な紹介: 1. クライアントとサーバーの間に永続的な接続を確立してリアルタイムの双方向通信を実現できる WebSocket フロントエンドは WebSocket API を使用して WebSocket 接続を作成し、送受信によるインスタント メッセージングを実現できます。 2. Long Polling(リアルタイム通信を模擬する技術)など

$nextTick を使用して Vue で DOM を非同期的に更新する方法 $nextTick を使用して Vue で DOM を非同期的に更新する方法 Jun 11, 2023 pm 12:28 PM

Vue は、シングルページ アプリケーションの構築に広く使用されている人気のある JavaScript フレームワークです。応答性の高いデータ バインディングとコンポーネント化されたアーキテクチャを採用し、多くの便利なツールとメソッドを提供します。 Vue では、データが変更されると、それらの変更を反映するためにビューが自動的に更新されます。ただし、リストに新しい項目を追加する必要がある場合など、データが更新された直後に DOM 要素を操作する必要がある状況もあります。現時点では、Vue が提供する $nextTick メソッドを使用して、D を非同期的に更新できます。

See all articles