VUE v-for の :key の詳細な説明

VUE v-for の :key の詳細な説明

v-for タグにキーが追加されていない場合。

<!DOCTYPE html>
<html lang="ja">
<ヘッド>
  <メタ文字セット="UTF-8">
  <meta http-equiv="X-UA-compatible" content="IE=edge">
  <meta name="viewport" content="width=デバイス幅、初期スケール=1.0">
  <script src="../../js/vue.js"></script>
  <title>v-for キーについて</title>
</head>
<本文>
  <div id="アプリ">
    <div>
      <input type="text" v-model="名前">
      <button @click="add">追加</button>
    </div>
    <ul>
      <li v-for="(リスト内の項目、インデックス)">
        <input type="checkbox"> {{item.name}}
      </li>
    </ul>
  </div>
  <script type="text/javascript">
    constアプリ = 新しいVue({
      el: '#app',
      データ() {
        戻る {
          名前: ''、
          新しいID: 3,
          リスト: [
            { id: 1, name: '张三' },
            { id: 2, 名前: 'Li Si' },
            { id: 3、名前: '王五' }
          ]、
        };
      },
      計算: {
      },
      メソッド: {
        追加() {
          //これはunshiftであることに注意してください
          this.list.unshift({ id: ++this.newId, name: this.name })
          this.name = ''
        }
      },
    });
  </スクリプト>
  <スタイルスコープ>
  </スタイル>
</本文>
</html>

李斯を選択して趙柳を加えた後、選択された人物は張三になりました。

ここに画像の説明を挿入

ここに画像の説明を挿入

v-for にキーがある場合を見てみましょう。

<!DOCTYPE html>
<html lang="ja">
<ヘッド>
  <メタ文字セット="UTF-8">
  <meta http-equiv="X-UA-compatible" content="IE=edge">
  <meta name="viewport" content="width=デバイス幅、初期スケール=1.0">
  <script src="../../js/vue.js"></script>
  <title>v-for キーについて</title>
</head>
<本文>
  <div id="アプリ">
    <div>
      <input type="text" v-model="名前">
      <button @click="add">追加</button>
    </div>
    <ul>
      <li v-for="(item, index) in list" :key="item.id">
        <input type="checkbox"> {{item.name}}
      </li>
    </ul>
  </div>
  <script type="text/javascript">
    constアプリ = 新しいVue({
      el: '#app',
      データ() {
        戻る {
          名前: ''、
          新しいID: 3,
          リスト: [
            { id: 1, name: '张三' },
            { id: 2, 名前: 'Li Si' },
            { id: 3、名前: '王五' }
          ]、
        };
      },
      計算: {
      },
      メソッド: {
        追加() {
          //これはunshiftであることに注意してください
          this.list.unshift({ id: ++this.newId, name: this.name })
          this.name = ''
        }
      },
    });
  </スクリプト>
  <スタイルスコープ>
  </スタイル>
</本文>
</html>

ここに画像の説明を挿入

ここに画像の説明を挿入

Li Si を選択して Zhao Liu を追加した後、選択された人物は依然として Li Si であり、変更はありません。

これは、Vue の下部にある Diff アルゴリズムによるものです。 diff アルゴリズムの処理方法は、次の図に示すように、操作の前後で DOM ツリーの同じレベルにあるノードをレイヤーごとに比較することです。

ここに画像の説明を挿入

レイヤー内に同一のノード、つまりリスト ノードが多数ある場合、Diff アルゴリズムの更新プロセスもデフォルトで上記の原則に従います。

たとえば、次のような状況を考えてみましょう。

ここに画像の説明を挿入

B と C の間に F を追加したいと考えています。Diff アルゴリズムのデフォルトの実装は次のとおりです。

ここに画像の説明を挿入

つまり、C を F に、D を C に、E を D に更新し、最後に E を挿入します。これは非効率的ではありませんか?

したがって、Diff アルゴリズムがノードを正しく識別し、新しいノードを挿入する正しい場所を見つけられるように、キーを使用して各ノードを一意に識別する必要があります。

ここに画像の説明を挿入

vue のリスト ループには、key = "一意の識別子" を追加する必要があります。一意の識別子は、アイテム内の id インデックスなどになります。vue コンポーネントは再利用性が高いため、Key を追加するとコンポーネントの一意性を識別できます。各コンポーネントをより適切に区別するために、キーの主な機能は、仮想 DOM を効率的に更新することです。

要約する

この記事はこれで終わりです。皆さんのお役に立てれば幸いです。また、123WORDPRESS.COM のその他のコンテンツにも注目していただければ幸いです。

以下もご興味があるかもしれません:
  • Vue における v-for のキーの一意性の詳細な説明
  • Vue で v-for を使用するときに、インデックスをキーとして使用できないのはなぜですか?
  • VUEデモv-forにキーを追加する理由についての簡単な説明
  • vue v-for のループをトラバースするときにキー値エラーが発生する問題を解決する
  • Vue の v-for ループの主要属性に関する考慮事項のまとめ
  • Vue 2.0 の v-for 反復構文の変更点 (キー、インデックス) に関する簡単な説明

<<:  HTMLポップアップ透明レイヤーインスタンスのサイズを設定でき、比例することができます

>>:  Ubuntu のインストール グラフィック ドライバーと Cuda チュートリアル

推薦する

Vueのprovideとinjectの使い方と原則を分析する

まず、provide/inject を使用する理由について説明しましょう。祖父コンポーネントと孫コン...

異なるブラウザ間で互換性のあるテキスト配置を実現する CSS

フォームのフロントエンド レイアウトでは、テキスト ボックスのプロンプト テキストを両端に揃える必要...

MySQL 5.x 以降を使用している場合のエラー #1929 列 ''createtime'' の日付時刻値が正しくありません: '''' の簡単な解決方法

MySQL をインストールした後、テーブル データを保存および削除しようとすると、常にエラー メッセ...

JSフロントエンドモジュール化のいくつかの仕様についての簡単な説明

目次序文フロントエンドモジュール開発の価値厄介な名前の競合面倒なファイル依存関係モジュール化の利点C...

HTMLにリンクを挿入する方法

各 Web ページには、URL () で識別されるアドレスがあります。通常、Web サイト内でリンク...

Ubuntu 20.04 デスクトップのインストールとルート権限の有効化および SSH インストールの詳細

記事は主にUbuntu 20.04の簡単なインストールプロセスを記録し、インストール後に国内ソースを...

Nest.js のハッシュと暗号化の例の詳細な説明

0x0 はじめにまず、ハッシュアルゴリズムとは何でしょうか?メッセージやセッション項目など、一部のデ...

ウェブサイトのコンテンツの100~1%はナビゲーションである

ウェブサイトでは、コンテンツの(100-1)%がナビゲーションです1. ジェシー・ジェームズ・ギャレ...

フロントエンドHTMLスキン変更機能の実装コード

透明を含む5つの肌の色を変更するには50行のコードが必要です最初にコードをお渡ししますので、ご自身で...

Web インタビュー Vue カスタム コンポーネントと呼び出しメソッド

輸入:プロジェクトの要件により、同じコードの一部をコンポーネントにカプセル化し、必要な場所にインポー...

Dockerはbusyboxを使用してベースイメージを作成します

Docker イメージの最初の行は FROM alpine などのイメージで始まりますが、最初のベー...

MySQL スケジュールバックアップタスクの簡単な分析

導入実稼働環境では、データの損失を回避するために、通常、データベースは定期的にバックアップされます。...

MySQL でのデータベース間クエリの例

序文MySQL では、クロスデータベース クエリは主に 2 つの状況に分けられます。1 つは同じサー...

MySQL で中国語を入力するときに発生するエラー 1366 の解決方法

MySQL で中国語を入力すると、次のエラーが発生します。エラー 1366: 1366: 行 1 の...

Vue ソースコード学習でレスポンシブ性を実装する方法

目次序文1. レスポンシブシステムの重要な要素1. データの変更を監視する方法2. 依存関係を収集す...