検索
ホームページウェブフロントエンドVue.jsvue における nextTick の包括的な分析

次のVue.jsチュートリアル列では、vueのnextTickについて紹介します。一定の参考値があるので、困っている友達が参考になれば幸いです。

vue における nextTick の包括的な分析

#vue は非常に人気のあるフレームワークで、angular と React の利点を組み合わせて、双方向のデータ バインディング機能を備えた軽量で使いやすい mvvm を形成します。フレーム。私はそれを使用することを好みます。 vueを使うときによく使うのが this.$nextTick というメソッドで、皆さんも使ったことがあると思います。私が使用する一般的なシナリオは、データを取得した後、新しいビューで次の手順または他の操作を実行する必要があるときに、DOM を取得できないことが判明するというものです。割り当て操作ではデータ モデルの変更が完了するだけで、ビューの更新は完了しないためです。このとき、この章で紹介する機能を使用する必要があります。

nextTick を使用する理由

次のコード部分を参照してください

new Vue({
  el: '#app',
  data: {
    list: []
  },
  mounted: function () {
    this.get()
  },
  methods: {
    get: function () {
      this.$http.get('/api/article').then(function (res) {
        this.list = res.data.data.list
        // ref  list 引用了ul元素,我想把第一个li颜色变为红色
        this.$refs.list.getElementsByTagName('li')[0].style.color = 'red'
      })
    },
  }
})

データを取得した後、それをデータ モデルを参照してから、ul 要素を参照して最初の li を見つけ、その色を赤に変更したいのですが、実際にはエラーが報告されます。この文を実行すると、ul の下に li がありません。これは、次のことを意味します。実行された割り当て操作は現在行われていません。ビュー レイヤへの更新は行われません。

したがって、この場合、vue は $nextTick メソッドを提供します。将来、更新されたビューを操作したい場合は、実行する関数を this.$nextTick メソッドに渡すだけで済みます。 . 、vue がこの作業を行ってくれます。

ソースコードの解釈

この関数は、vue2.2.6 バージョンの 450 行目から始まる非常に単純です。

まず第一に、この関数は単純関心モードを使用しますか、それとも何かによって作成されたクロージャ関数ですか?

var callbacks = [];   // 缓存函数的数组
var pending = false;  // 是否正在执行
var timerFunc;  // 保存着要执行的函数

まず、後で使用するためにいくつかの変数が定義されています。以下は関数です。

function nextTickHandler () {
  pending = false;
  //  拷贝出函数数组副本
  var copies = callbacks.slice(0);
  //  把函数数组清空
  callbacks.length = 0;
  // 依次执行函数
  for (var i = 0; i < copies.length; i++) {
    copies[i]();
  }
}

この関数は、$nextTick で実際に呼び出される関数です。

次に、Vue は上記の関数の呼び出しを遅らせるために 3 つの状況に分けます。$nextTick の目的は、dom が更新されるまで受信関数を遅らせてから使用することであるため、ここではエレガントな降順で js を使用します。 . これを行うためのメソッド。

1. Promise.then の遅延呼び出し

if (typeof Promise !== &#39;undefined&#39; && isNative(Promise)) {
  var p = Promise.resolve();
  var logError = function (err) { console.error(err); };
  timerFunc = function () {
    p.then(nextTickHandler).catch(logError);
    if (isIOS) { setTimeout(noop); }
  };
}

ブラウザが Promise をサポートしている場合は、Promise.then を使用して関数呼び出しを遅延させます。関数を現在の関数呼び出しスタックの最後まで遅延させます。つまり、関数は関数呼び出しスタックの最後に呼び出されます。それにより遅延が発生します。

2. MutationObserver は変更を監視します

else if (typeof MutationObserver !== &#39;undefined&#39; && (
  isNative(MutationObserver) ||
  MutationObserver.toString() === &#39;[object MutationObserverConstructor]&#39;
)) {

  var counter = 1;
  var observer = new MutationObserver(nextTickHandler);
  var textNode = document.createTextNode(String(counter));
  observer.observe(textNode, {
    characterData: true
  });
  timerFunc = function () {
    counter = (counter + 1) % 2;
    textNode.data = String(counter);
  };
}

MutationObserver は h5 によって追加された新しい関数で、その機能は dom ノードの変更を監視し、すべての dom 変更が完了した後に実行することです。 。 折り返し電話。

監視すべき具体的な変更がいくつかあります

  • childList: 子要素の変更

  • attributes: 属性の変更

  • characterData: ノード コンテンツまたはノード テキストの変更

  • subtree: すべての下位ノード (子ノードおよび子ノードの子ノードを含む)

上記のコードは、テキスト ノードを作成してテキスト ノードの内容を変更し、変更をトリガーすることがわかります。これは、データ モデルを更新した後、dom ノードが再レンダリングです。

そこで、このような変更リスナーを追加し、テキスト ノードの変更でリスナーをトリガーし、すべての dom がレンダリングされた後に関数を実行して遅延効果を実現しました。

3. setTimeout 遅延器

else {
    timerFunc = function () {
      setTimeout(nextTickHandler, 0);
    };
  }

setTimeout の遅延原理を使用して、setTimeout(func, 0) は func 関数を次の関数呼び出しスタックの先頭まで遅延させます。つまり、現在の関数が実行された後に関数が実行され、遅延関数が完了します。

クロージャー関数

return function queueNextTick (cb, ctx) {
    var _resolve;
    callbacks.push(function () {
      if (cb) { cb.call(ctx); }
      if (_resolve) { _resolve(ctx); }
    });
    // 如果没有函数队列在执行才执行
    if (!pending) {
      pending = true;
      timerFunc();
    }
    // promise化
    if (!cb && typeof Promise !== &#39;undefined&#39;) {
      console.log(&#39;进来了&#39;)
      return new Promise(function (resolve) {
        _resolve = resolve;
      })
    }
  }

return関数は実際に使用するクロージャー関数です。関数を追加するたびにコールバックを考えることになります。 . 関数配列がスタックにプッシュされます。次に、関数が現在実行されているかどうかを監視し、実行されていない場合は関数を実行します。これはわかりやすいですね。次のifは約束です。

this.$nextTick(function () {

})
// promise化
this.$nextTick().then(function () {

}.bind(this))

上記のコードを記述する 2 番目の方法は、私たちにとっては一般的ではありません。これは、$nextTick 関数を直接呼び出して、Promise 形式でコードを記述します。ただし、これは then と で手動でバインドする必要があります。 Vue は内部的には処理しません。

関連する推奨事項:

2020 フロントエンド vue インタビューの質問の概要 (回答付き)

vue チュートリアルおすすめ: 2020 年の最新の vue.js ビデオ チュートリアル 5 選

プログラミング関連の知識について詳しくは、プログラミング コースをご覧ください。 !

以上がvue における nextTick の包括的な分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事は博客园で複製されています。侵害がある場合は、admin@php.cn までご連絡ください。
フレームワークの選択:Netflixの決定を推進するものは何ですか?フレームワークの選択:Netflixの決定を推進するものは何ですか?Apr 13, 2025 am 12:05 AM

Netflixは、主に、パフォーマンス、スケーラビリティ、開発効率、エコシステム、技術的な負債、およびフレームワーク選択におけるメンテナンスコストを考慮しています。 1。パフォーマンスとスケーラビリティ:JavaとSpringbootが選択され、大規模なデータと高い同時リクエストを効率的に処理します。 2。開発効率とエコシステム:Reactを使用して、フロントエンド開発効率を向上させ、その豊富なエコシステムを利用します。 3.技術的な負債とメンテナンスコスト:node.jsを選択してマイクロサービスを構築して、メンテナンスコストと技術的債務を削減します。

Netflixのフロントエンドの反応、Vue、および未来Netflixのフロントエンドの反応、Vue、および未来Apr 12, 2025 am 12:12 AM

Netflixは、主にReactをフロントエンドフレームワークとして使用し、特定の機能のためにVUEによって補足されます。 1)Reactのコンポーネント化と仮想DOMは、Netflixアプリケーションのパフォーマンスと開発効率を向上させます。 2)VueはNetflixの内部ツールと小規模プロジェクトで使用されており、その柔軟性と使いやすさが重要です。

フロントエンドのvue.js:実際のアプリケーションと例フロントエンドのvue.js:実際のアプリケーションと例Apr 11, 2025 am 12:12 AM

Vue.jsは、複雑なユーザーインターフェイスを構築するのに適した進歩的なJavaScriptフレームワークです。 1)そのコア概念には、レスポンシブデータ、コンポーネント、仮想DOMが含まれます。 2)実際のアプリケーションでは、TODOアプリケーションを構築し、Vuerouterを統合することで実証できます。 3)デバッグするときは、vuedevtools and Console.logを使用することをお勧めします。 4)パフォーマンスの最適化は、V-IF/V-Show、リストレンダリング最適化、コンポーネントの非同期負荷などを通じて達成できます。

Vue.jsとReact:重要な違​​いを理解するVue.jsとReact:重要な違​​いを理解するApr 10, 2025 am 09:26 AM

Vue.JSは中小企業から中規模のプロジェクトに適していますが、Reactは大規模で複雑なアプリケーションにより適しています。 1。VUE.JSのレスポンシブシステムは、依存関係追跡を介してDOMを自動的に更新し、データの変更を簡単に管理できるようにします。 2.反応は一方向のデータフローを採​​用し、データは親コンポーネントから子コンポーネントに流れ、明確なデータフローと簡単な抽出構造を提供します。

Vue.js vs. React:プロジェクト固有の考慮事項Vue.js vs. React:プロジェクト固有の考慮事項Apr 09, 2025 am 12:01 AM

VUE.JSは、中小規模のプロジェクトや迅速な反復に適していますが、Reactは大規模で複雑なアプリケーションに適しています。 1)Vue.jsは使いやすく、チームが不十分な状況やプロジェクトスケールが小さい状況に適しています。 2)Reactにはより豊富なエコシステムがあり、高性能で複雑な機能的ニーズを持つプロジェクトに適しています。

Vueにタグをジャンプする方法Vueにタグをジャンプする方法Apr 08, 2025 am 09:24 AM

VUEでタグのジャンプを実装する方法には、HTMLテンプレートでAタグを使用してHREF属性を指定する方法が含まれます。 VUEルーティングのルーターリンクコンポーネントを使用します。 JavaScriptでこれを使用します。$ router.push()メソッド。パラメーターはクエリパラメーターに渡すことができ、ルートは動的ジャンプのルーターオプションで構成されています。

VUEのコンポーネントジャンプを実装する方法VUEのコンポーネントジャンプを実装する方法Apr 08, 2025 am 09:21 AM

VUEでコンポーネントジャンプを実装するための次の方法があります。Router-Linkと&lt; router-view&gt;を使用してください。ハイパーリンクジャンプを実行し、ターゲットパスとして属性を指定するコンポーネント。 &lt; router-view&gt;を使用してください現在ルーティングされているレンダリングされているコンポーネントを表示するコンポーネント。プログラマティックナビゲーションには、router.push()およびrouter.replace()メソッドを使用します。前者は歴史を保存し、後者は記録を残さずに現在のルートに取って代わります。

VueのDivにジャンプする方法VueのDivにジャンプする方法Apr 08, 2025 am 09:18 AM

VUEにDIV要素をジャンプするには、VUEルーターを使用してルーターリンクコンポーネントを追加するには、2つの方法があります。 @clickイベントリスナーを追加して、これを呼び出します。$ router.push()メソッドをジャンプします。

See all articles

ホット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ヘンタイを無料で生成します。

ホットツール

mPDF

mPDF

mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。

SecLists

SecLists

SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

EditPlus 中国語クラック版

EditPlus 中国語クラック版

サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

SublimeText3 Linux 新バージョン

SublimeText3 Linux 新バージョン

SublimeText3 Linux 最新バージョン

Dreamweaver Mac版

Dreamweaver Mac版

ビジュアル Web 開発ツール