Vue の nextTick について話す

Vue の nextTick について話す

データが変更されても、DOM ビューはすぐには更新されません。変更直後にノードまたはその値を取得しようとすると、結果は未定義になる可能性があります。これは、Vue が応答性を実装するのは、データの変更後に DOM がすぐに変更されるからではなく、特定の戦略に従って DOM を更新するためです。

小さなデモを見てみましょう:

アプリ.vue

<テンプレート>
  <div id="アプリ">
        <div ref="メッセージ">{{メッセージ}}</div>
        <div v-if="msg1">{{msg1}}</div>
        <button @click="changeMsg">メッセージを変更する</button>
  </div>
</テンプレート>

<スクリプト>
エクスポートデフォルト{
  名前: 'アプリ'、
  データ(){
    戻る {
      メッセージ:「こんにちは Vue」
      メッセージ1: ''、
    }
  },
  方法:{
    変更メッセージ(){
      this.msg = 'こんにちは世界';
      this.msg1=this.$refs.message.innerHTML;
       console.log("DOM を更新する前: "+this.msg1)
    }
  }
}
</スクリプト>

<スタイル>
#アプリ {
  フォントファミリ: 'Avenir'、Helvetica、Arial、sans-serif;
  -webkit-font-smoothing: アンチエイリアス;
  -moz-osx-font-smoothing: グレースケール;
  テキスト配置: 中央;
  色: #2c3e50;
  上マージン: 60px;
}
</スタイル>

コードを実行すると、this.$nextTick メソッドで DOM 操作を実行しないと、this.$refs.message.innerHTML の値に以前の初期値が引き続き保存されることがわかります。

コードを変更します:

アプリ.vue

<テンプレート>
  <div id="アプリ">
        <div ref="メッセージ">{{メッセージ}}</div>
        <div v-if="msg1">{{msg1}}</div>
        <button @click="changeMsg">メッセージを変更する</button>
  </div>
</テンプレート>

<スクリプト>
エクスポートデフォルト{
  名前: 'アプリ'、  
  データ(){
    戻る {
      メッセージ:「こんにちは Vue」
      メッセージ1: ''、
    }
  },
  方法:{
    変更メッセージ(){
      this.msg = 'こんにちは世界';
      // this.msg1=this.$refs.message.innerHTML;
      // console.log("DOM を更新する前: "+this.msg1)
        this.$nextTick(()=>{
          this.msg1=this.$refs.message.innerHTML;
          console.log("DOM を更新した後: "+this.msg1)
        })
    }
  }
}
</スクリプト>

<スタイル>
#アプリ {
  フォントファミリ: 'Avenir'、Helvetica、Arial、sans-serif;
  -webkit-font-smoothing: アンチエイリアス;
  -moz-osx-font-smoothing: グレースケール;
  テキスト配置: 中央;
  色: #2c3e50;
  上マージン: 60px;
}
</スタイル>

コードを変更すると、公式 Web サイトで説明されているように、this.$nextTick を使用して更新された値を簡単に受け取ることができることがわかります。遅延されたコールバックは、次の DOM 更新サイクルが終了した後に実行されます。更新された DOM を取得するには、データを変更した直後にこのメソッドを使用します。

コードを変更して比較してみましょう。

アプリ.vue

<テンプレート>
  <div id="アプリ">
        <div ref="メッセージ">{{メッセージ}}</div>
        <div v-if="msg1">{{msg1}}</div>
        <button @click="changeMsg">メッセージを変更する</button>
  </div>
</テンプレート>

<スクリプト>
エクスポートデフォルト{
  名前: 'アプリ'、  
  データ(){
    戻る {
      メッセージ:「こんにちは Vue」
      メッセージ1: ''、
    }
  },
  方法:{
    変更メッセージ(){
      this.msg = 'こんにちは世界';
      this.msg1=this.$refs.message.innerHTML;
       console.log("DOM を更新する前: "+this.msg1)
        this.$nextTick(()=>{
          this.msg1=this.$refs.message.innerHTML;
          console.log("DOM を更新した後: "+this.msg1)
        })
    }
  }
}
</スクリプト>

<スタイル>
#アプリ {
  フォントファミリ: 'Avenir'、Helvetica、Arial、sans-serif;
  -webkit-font-smoothing: アンチエイリアス;
  -moz-osx-font-smoothing: グレースケール;
  テキスト配置: 中央;
  色: #2c3e50;
  上マージン: 60px;
}
</スタイル>

コードを変更すると、this.$nextTick(callback) の役割が簡単にわかります。callback はコールバック関数であり、DOM を操作するために実行します。

適用シナリオ:

  • Vue の created() ライフサイクルフック関数で DOM 操作を実行する場合は、必ず DOM 操作を this.$nextTick(); に入れてください。
  • 作成フック関数がトリガーされると、DOM はレンダリングされないため、DOM がレンダリングされない場合、DOM 操作は間違いなく無駄になります。
  • したがって、create で DOM 操作を実行するときは、DOM 操作を this.$nextTick(); に配置する必要があります。
  • その逆はマウントです。マウントがトリガーされると、DOM のマウントとレンダリングが完了しているため、マウントされた状態で DOM 操作を実行しても問題はありません。

DOM の更新は非同期であるため、v-if ディレクティブが DOM 要素の追加と削除を決定するのと同様に、メソッド内で変数に値を割り当てるときに this.$nextTick() を使用しないと、初期値を取得してしまう可能性があります。更新された値を取得したい場合は、this.$nextTick() メソッドを使用する必要があります。

以上がVueにおけるnextTickの詳しい内容です。Vueについてさらに詳しく知りたい方は、123WORDPRESS.COM内の他の関連記事もぜひご覧ください!

以下もご興味があるかもしれません:
  • Vue nextTickの原理の分析
  • 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 メカニズムの詳細な理解

<<:  Tomcat での jar のロードに関する異常な問題の分析と解決

>>:  LinuxにMySQLデータベース5.6のソースコードをインストールし、ログインユーザーのパスワードを変更する

推薦する

シンプルなプログレスバーを作成するための HTML+CSS

1. HTMLコードコードをコピーコードは次のとおりです。経験値: <span class=...

jsのディープコピーを理解しましょう

目次js ディープコピーデータ保存方法浅いコピー/深いコピーとは何か一般的なディープコピーの実装1....

アコーディオン効果を実現するネイティブ js

実際のWebページ開発でも、アコーディオンは頻繁に登場します。簡単なアコーディオンを作ったのですが、...

CocosCreatorの共通知識ポイントを整理する

目次1. シーンの読み込み2. ノードを見つける1. ノード検索2. その他のノード操作3. 再生ア...

ウェブサイトのホームページを作成するための基本原則

1. ウェブサイトのホームページのハイパーテキスト ドキュメントの構成構造は、ユーザーの注意をできる...

Vueはリストのシームレスなスクロールを実装します

この記事の例では、リストのシームレスなスクロールを実現するためのvueの具体的なコードを参考までに共...

JS の Promise に中止関数を追加する方法

目次概要プロミスレースメソッド約束の再パッケージ化中止コントローラAxiosプラグインにはキャンセル...

ふるい抽選を実施するミニプログラム

この記事の例では、ふるい抽選を実装するためのミニプログラムの具体的なコードを参考までに共有しています...

Windows 64 ビット版の MySQL 8.0.15 インストール チュートリアル

まず公式サイトにアクセスしてダウンロードし、MySQLダウンロードをクリックします。 ダウンロードし...

js 日付と時刻のフォーマット方法の例

js 日付時刻形式日付と時刻を指定された形式に変換します。例: YYYY-mm-dd HH:MM は...

表示しているページのスナップショットを Baidu が保存できないように設定する方法

今日、Baidu でページを検索したところ、ページが削除されていたため、当然 Baidu スナップシ...

HTML フォーム送信アクションと URL ジャンプアクションの違い

フォームのアクションは URL ジャンプとは異なります。フォームはバックグラウンドにデータを渡すこと...

JavaScriptコールバック関数の詳細な理解

目次序文クイックレビュー: JavaScript 関数関数とは何ですか?関数を宣言する関数の呼び出し...

mysql IS NULL インデックスケースの説明を使用する

導入MySQL の SQL クエリ ステートメントで is null、is not null、!= ...