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 チュートリアル

推薦する

Docker コンテナのマウントディレクトリ操作の表示

Dockerコンテナのマウントディレクトリ情報のみを表示する docker 検査 --format ...

goaccess を使用して nginx ログを分析する詳細な方法

最近、goaccess を使って nginx ログを分析したいのですが、nginx ログの設定形式が...

MySQLの共通関数を使用してJSONを処理する方法

公式ドキュメント: JSON 関数名前説明JSON_APPEND() JSONドキュメントにデータを...

docker-compose ポートと expose の違いの詳細な説明

docker-compose でコンテナ ポートを公開する方法は、ports と expose の ...

MySQLデータベースを誤って削除した後にデータを回復するための手順

日々の運用・保守作業において、MySQL データベースのバックアップは重要です。ウェブサイトにとって...

MySQL に 1,000 万件のレコードを素早く挿入する方法

面接で「MySQL に 1,000 万件のレコードをすばやく挿入するにはどうすればよいか」という質問...

さまざまなマウスの形状を表現する方法

<a href = "http://" style = "cur...

MySQL データベースでよく使用される SQL ステートメントの詳細と概要

この記事では、MySQL データベースでよく使用される SQL ステートメントを例を使用して説明しま...

HTML での一般的なリダイレクト接続の例コード

コードをコピーコードは次のとおりです。 window.location.href="zcb...

Dockerはイメージ名とTAG操作の名前を変更します

docker イメージを使用する場合、以下に示すように、REPOSITORY と TAG の両方が ...

子コンポーネントで vue activated を使用する詳細

ページ: ベース: <テンプレート> <div class="タブコンテ...

インタビューの質問: ホーリー グレイル レイアウトとダブル ウィング レイアウトの違い

序文今日は、聖杯レイアウトとダブルウィングレイアウト、そしてそれらの違いについてお話しします。この2...

CSSとJSでロマンチックな流星群アニメーションを実現

1. レンダリング 2. ソースコードhtml < 本文 > < div クラス ...

Centos6 で 20TB を超えるディスクをパーティション分割してフォーマットするためのサンプル コード

1. サーバー環境の構成: 1. ディスクパーティションを確認します。最近、あるプロジェクト内のサー...

モバイル Web アプリ上の画像が鮮明ではなく、非常にぼやけているのはなぜですか?

なぜ?最も簡単に言えば、ピクセルは均等ではないということです。携帯電話に表示される写真はとても繊細に...