ホームページ ウェブフロントエンド Vue.js Vue3のnextTick関数の詳細解説:DOM更新後の処理動作

Vue3のnextTick関数の詳細解説:DOM更新後の処理動作

Jun 18, 2023 am 09:30 AM
vue nexttick ダムのアップデート

フロントエンド テクノロジーの急速な発展に伴い、最新のフロントエンド フレームワークが際限なく登場していますが、Vue.js はその中でも最高のものの 1 つです。 Vue.js は、学習が容易で効率的かつ柔軟な進歩的な JavaScript フレームワークであり、インタラクティブな Web インターフェイスの構築に最適です。 Vue.js 3 は Vue.js の最新バージョンであり、一連の継続的なパフォーマンスの向上、アーキテクチャの再構築、開発エクスペリエンスの向上を通じて、Vue.js の優位性がさらに向上しています。その中でも、nextTick 関数は、さらに検討する価値のある Vue.js 3 の機能です。

この記事では、Vue.js 3 の nextTick 関数について、基本的な使用法、実装原理、アプリケーション シナリオなどを詳しく紹介します。

1. nextTick 関数の基本的な使用法

Vue.js の nextTick 関数は、DOM が更新された後に特定の操作を実行するために使用される非同期メソッドです。これはマイクロタスク方式で実行されます。つまり、同じイベント ループ内で、すべての同期タスクが完了直後に実行されます。これにより、nextTick によって呼び出されるコールバックが実際の DOM 更新後に確実に実行されます。これは、DOM が更新された後に操作している場合に非常に重要です。

Vue.js 3 では、nextTick 関数を使用して次の機能を実現できます。

  1. データ変更直後の DOM の操作

Vue.js は非同期更新戦略を使用しているため、データが変更された後、DOM はすぐには更新されず、Vue.js の次の更新が再レンダリングされるまで待機します。データが変更された直後に DOM を操作する必要がある場合は、nextTick 関数を使用できます。

たとえば、テンプレートで v-if ディレクティブを使用して、コンテンツの表示/非表示の効果を実現します。データの変更に応じて DOM スタイルを変更する必要がある場合、nextTick 関数を使用してこれを実現できます。

<template> 
  <div>
    <button @click="toggleContent">切换内容显示</button>
    <div v-if="showContent" ref="content">这是要显示的内容</div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      showContent: false
    }
  },
  methods: {
    toggleContent() {
      this.showContent = !this.showContent
      this.$nextTick(() => {
        // 在DOM更新后,修改样式
        this.$refs.content.style.color = 'red'
      })
    }
  }
}
</script>
ログイン後にコピー
  1. 更新された DOM 情報を取得する

データが更新され、更新された DOM 情報を取得する必要がある場合は、nextTick 関数を使用できます。実際のDOMが更新された後にnextTick関数が実行されるため、更新されたDOM情報を取得できます。

たとえば、テンプレート内の v-for 命令を使用して配列を走査し、DOM が更新された後に li 要素のスタイル情報を取得します。

<template>
  <div>
    <ul>
      <li v-for="item in list" :key="item">{{ item }}</li>
    </ul>
    <button @click="getListStyle">获取列表样式</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      list: ['item1', 'item2', 'item3']
    }
  },
  methods: {
    getListStyle() {
      this.list.push('item4')
      this.$nextTick(() => {
        // 获取更新后的li元素样式信息
        const liList = document.querySelectorAll('li')
        liList.forEach((li) => {
          console.log(li.style)
        })
      })
    }
  }
}
</script>
ログイン後にコピー

2. nextTick 関数の実装原理

Vue.js 3 では、nextTick 関数を実装する主な方法は Promise を使用する方法と MutationObserver を使用する方法の 2 つがあります。

  1. Promise の使用

Vue.js 3 では、Promise を使用して nextTick 関数をカプセル化します。具体的なプロセスは次のとおりです。

// 初始化Promise
const promise = Promise.resolve()

export function nextTick(callback?: Function) {
  // 将回调包装成一个微任务函数
  return promise.then(callback)
}
ログイン後にコピー

上記のコードでは、Promise.resolve() を使用して Promise オブジェクトを初期化し、新しい Promise オブジェクトを返し、then() にコールバック関数のコールバックを登録します。方法。 Promise はマイクロタスクであるため、nextTick 関数のコールバック関数もマイクロタスクであり、setTimeout や setImmediate よりも効率的です。

  1. MutationObserver の使用

MutationObserver はブラウザに付属する非同期 API であり、DOM ツリー内の変更を監視して非同期操作を実現するために使用できます。

Vue.js 3 では、nextTick 関数を MutationObserver を通じてカプセル化できます。

const callbacks = []
let pending = false

// 回调函数
function flushCallbacks() {
  // 标记异步任务已经在执行
  pending = false
  // 执行回调函数
  const copies = callbacks.slice(0)
  callbacks.length = 0
  for (let i = 0; i < copies.length; i++) {
    copies[i]()
  }
}

// 创建Observer实例
const observer = new MutationObserver(flushCallbacks)

// 注册用户行为
const textNode = document.createTextNode(String(0))
observer.observe(textNode, {
  characterData: true
})

export function nextTick(callback?: Function) {
  callbacks.push(() => {
    if (callback) {
      try {
        callback()
      } catch (e) {
        console.error(e)
      }
    }
  })

  if (!pending) {
    // 标记异步任务未执行
    pending = true
    // 改变textNode的值
    textNode.data = String(Date.now())
  }
}
ログイン後にコピー

上記のコードでは、MutationObserver を使用して Observer インスタンスが作成され、characterData の変更をリッスンするために textNode ノードが登録されます。textNode のデータ属性が変更されると、 flashCallbacks()メソッドが実行されます。 nextTick では、コールバック関数 callback を callbacks 配列に配置し、textNode のデータ属性を変更し、MutationObserver のcharacterData 変更イベントをトリガーします。これにより、flushCallbacks() メソッドが実行され、すべてのコールバック関数が実行されます。

3. nextTick 関数の応用シナリオ

Vue.js の nextTick 関数には多くの応用シナリオがありますが、ここではそのうちのいくつかのみを紹介します。

  1. v-for 命令での DOM 操作

v-for 命令を使用して配列を走査する場合、すべての DOM 要素を操作する必要がある場合は、次のようにすることができます。 nextTick を使用します。

<template>
  <div>
    <ul>
      <li v-for="item in list" :key="item">{{ item }}</li>
    </ul>
  </div>
</template>

<script>
export default {
  data() {
    return {
      list: ['item1', 'item2', 'item3']
    }
  },
  methods: {
    operateDOM() {
      this.$nextTick(() => {
        // 操作所有的li元素
        const liList = document.querySelectorAll('li')
        liList.forEach((li, index) => {
          li.style.color = `hsl(${index * 50}, 70%, 50%)`
        })
      })
    }
  }
}
</script>
ログイン後にコピー

コードでは、v-for 命令で DOM を更新した後、nextTick 関数を使用してすべての li 要素を操作し、その色の値を設定します。

  1. 非同期データ更新後の DOM の操作

データを非同期更新した後、更新された DOM を操作する必要がある場合は、nextTick を使用することもできます。

<template>
  <div>
    <p>{{ message }}</p>
    <button @click="changeMessage">异步更改message</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      message: 'Hello Vue.js'
    }
  },
  methods: {
    changeMessage() {
      setTimeout(() => {
        this.message = 'Hello World'
        this.$nextTick(() => {
          // 操作更新后的DOM
          document.querySelector('p').style.color = 'red'
        })
      }, 1000)
    }
  }
}
</script>
ログイン後にコピー

コードでは、データを非同期に更新した後、setTimeout を使用して 1 秒遅延させてから、message の値を更新します。メッセージ値が更新されたら、nextTick関数を使用して更新されたDOMを操作し、p要素の色を赤に設定します。

  1. DOM ノードを動的に追加する

DOM ノードを動的に追加するときに、新しく追加された DOM ノードを操作する必要がある場合は、nextTick を使用することもできます。

<template>
  <div>
    <ul ref="list">
      <li v-for="item in list" :key="item">{{ item }}</li>
    </ul>
    <button @click="addItem">动态添加一项</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      list: ['item1', 'item2', 'item3']
    }
  },
  methods: {
    addItem() {
      this.list.push('item4')
      this.$nextTick(() => {
        // 操作新加入的li元素
        const liList = this.$refs.list.querySelectorAll('li')
        liList[liList.length - 1].style.color = 'red'
      })
    }
  }
}
</script>
ログイン後にコピー

コードでは、v-for 命令を使用して配列を走査し、ボタンをクリックすると項目が動的に追加されます。追加が完了したら、nextTick関数を使って新しく追加したli要素を操作し、色を赤に設定します。

4. 概要

Vue.js 3 では、nextTick 関数は非常に実用的な機能であり、DOM スタイルの変更や取得など、DOM の更新後にいくつかの特定の操作を実行できます。更新情報、最終的なDOM情報などnextTick 関数を実装するには、主に Promise を使用する方法と MutationObserver を使用する方法の 2 つがあります。実際の開発では、さまざまなアプリケーションシナリオに応じて、nextTick関数を柔軟に使用して、開発効率とユーザーエクスペリエンスを向上させることができます。

以上がVue3のnextTick関数の詳細解説:DOM更新後の処理動作の詳細内容です。詳細については、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)

VUEのボタンに関数を追加する方法 VUEのボタンに関数を追加する方法 Apr 08, 2025 am 08:51 AM

HTMLテンプレートのボタンをメソッドにバインドすることにより、VUEボタンに関数を追加できます。 VUEインスタンスでメソッドを定義し、関数ロジックを書き込みます。

VueでBootstrapの使用方法 VueでBootstrapの使用方法 Apr 07, 2025 pm 11:33 PM

vue.jsでBootstrapを使用すると、5つのステップに分かれています。ブートストラップをインストールします。 main.jsにブートストラップをインポートしますブートストラップコンポーネントをテンプレートで直接使用します。オプション:カスタムスタイル。オプション:プラグインを使用します。

vue.jsでJSファイルを参照する方法 vue.jsでJSファイルを参照する方法 Apr 07, 2025 pm 11:27 PM

vue.jsでJSファイルを参照するには3つの方法があります。タグ;; mounted()ライフサイクルフックを使用した動的インポート。 Vuex State Management Libraryを介してインポートします。

VueでWatchの使用方法 VueでWatchの使用方法 Apr 07, 2025 pm 11:36 PM

Vue.jsの監視オプションにより、開発者は特定のデータの変更をリッスンできます。データが変更されたら、Watchはコールバック関数をトリガーして更新ビューまたはその他のタスクを実行します。その構成オプションには、すぐにコールバックを実行するかどうかを指定する即時と、オブジェクトまたは配列の変更を再帰的に聴くかどうかを指定するDEEPが含まれます。

Vue Multi-Page開発とはどういう意味ですか? Vue Multi-Page開発とはどういう意味ですか? Apr 07, 2025 pm 11:57 PM

VUEマルチページ開発は、VUE.JSフレームワークを使用してアプリケーションを構築する方法です。アプリケーションは別々のページに分割されます。コードメンテナンス:アプリケーションを複数のページに分割すると、コードの管理とメンテナンスが容易になります。モジュール性:各ページは、簡単に再利用および交換するための別のモジュールとして使用できます。簡単なルーティング:ページ間のナビゲーションは、単純なルーティング構成を介して管理できます。 SEOの最適化:各ページには独自のURLがあり、SEOに役立ちます。

Vueによる前のページに戻る方法 Vueによる前のページに戻る方法 Apr 07, 2025 pm 11:30 PM

vue.jsには、前のページに戻る4つの方法があります。$ router.go(-1)$ router.back()outes&lt; router-link to =&quot;/&quot; Component Window.history.back()、およびメソッド選択はシーンに依存します。

Vueのバージョンを照会する方法 Vueのバージョンを照会する方法 Apr 07, 2025 pm 11:24 PM

Vue Devtoolsを使用してブラウザのコンソールでVueタブを表示することにより、Vueバージョンを照会できます。 NPMを使用して、「NPM List -G Vue」コマンドを実行します。 package.jsonファイルの「依存関係」オブジェクトでVueアイテムを見つけます。 Vue CLIプロジェクトの場合、「Vue -Version」コマンドを実行します。 &lt; script&gt;でバージョン情報を確認してくださいVueファイルを参照するHTMLファイルにタグを付けます。

Function Intercept Vueの使用方法 Function Intercept Vueの使用方法 Apr 08, 2025 am 06:51 AM

VUEの関数傍受は、指定された期間内に関数が呼び出され、パフォーマンスの問題を防ぐ回数を制限するために使用される手法です。実装方法は次のとおりです。LodashLibrary:Import {Debounce}から「Lodash」からインポート。 debounce関数を使用して、インターセプト関数を作成します。インターセプト関数を呼び出すと、制御関数は500ミリ秒でせいぜい1回呼び出されます。

See all articles