React でインデックスをキーとして使用することが推奨されないのはなぜですか?

React でインデックスをキーとして使用することが推奨されないのはなぜですか?

1. 古い仮想DOMと新しい仮想DOMを比較し、まずキーが同じかどうかを確認します。
2. 引き続き内容を比較し、置換用の新しい実際の DOM を生成します。
3. コンテンツとキーが同じ場合は、古い実際のDOMを変更せずに再利用します。

では、トラバーサル中に自動的に生成されたインデックスを各ノードのキーとして使用すると、どのような問題が発生する可能性がありますか? こちらは小さなケースです

まず、最初に人物を横断します

彼はそのようなプロセス、ソースデータになります

人数:
{ id: 1, 名前: “张三”, 年齢: 15 },
{ id: 2、名前: “Li Si”、年齢: 16 }、
]、

生成された実際のDOMノード

<ul>
      <li key="0">張三--15</li>
      <li key="1">李思--16</li>
    </ul>

次に、このリストの前に{id:3,name:'王五',age:14}のデータを挿入すると、次のようになります。

<ul>
   <li key="0">王武--14</li>
      <li key="1">張三--15</li>
      <li key="2">李思--16</li>
    </ul>

上記の更新により、王武が張三の以前のキーを占有していることがわかります。つまり、このプロセスを更新すると、新しい仮想dom

<li key="0">王武--14</li>

そして古い仮想DOM

<li key="0">張三--15</li>

新しいDOMを比較するときは、まず2つのキーを比較して、同じかどうかを確認します。内容を比較すると、1つはWang Wu-14で、もう1つはZhang San 15です。内容が変更されています。このとき、新しい仮想DOMを使用して新しい実DOMを生成し、ページを再レンダリングします。以前のZhang Sanが影響を受けて再生成する必要があるだけでなく、後続のLi SiもZhang Sanに置き換えられ、Zhang Sanの内容で新しい実DOMが生成されます。これにより、すべてのDOMが再生成されて再レンダリングされるため、パフォーマンスが低下します。

<!DOCTYPE html>
<html lang="ja">
  <ヘッド>
    <メタ文字セット="UTF-8" />
    <meta http-equiv="X-UA-compatible" content="IE=edge" />
    <meta name="viewport" content="width=デバイス幅、初期スケール=1.0" />
    <title>ドキュメント</title>
  </head>
  <本文>
    <script src="https://unpkg.com/react@16/umd/react.development.js"></script>
    <script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
    <script src="https://unpkg.com/[email protected]/babel.js"></script>

    <div id="ルート"></div>
    <script type="text/babel">
      root を document.getElementById("root"); とします。
      クラスAppはReact.Componentを拡張します。
        コンストラクタ(props) {
          スーパー(小道具);
        }
        状態 = {
          人数:
            { id: 1, 名前: "张三", 年齢: 15 },
            { id: 2、名前: "Li Si"、年齢: 16 }、
          ]、
        };
        ハンドル = () => {
          const { persons } = this.state;
          定数p = {
            id: 0,
            名前: 「王武」、
            年齢: 14歳
          };
          this.setState({
            人: [p, ...人],
          });
        };
        与える() {
          戻る (
            <div>
              <button onClick={this.handle}>クリックして追加</button>
              <ul>
                {this.state.persons.map((人, インデックス) => (
                  <li キー = {インデックス}>
                    {人名}--{人年齢}
                  </li>
                ))}
              </ul>
            </div>
          );
        }
      }
      ReactDOM.render(<App name="hell" />, ルート);
    </スクリプト>
  </本文>
</html>

上記の推論の後に id を唯一のキー値として使用した場合に何が起こるか想像してみてください。

アップデート前

<ul>
      <li key="1">張三--15</li>
      <li key="2">李思--16</li>
    </ul>

アップデート後

<ul>
   <li key="0">王武--14</li>
      <li key="1">張三--15</li>
      <li key="2">李思--16</li>
    </ul>

今回は Wang Wu が Zhang San の前に挿入されますが、Wang Wu と上のノードを比較して、同じ key=0 ノードがあるかどうかを確認するだけです。レンダリング用に新しい実際の DOM は生成されません。Zhang San は、上のノードと key=1 を比較し、key=1 のノードがあることを検出します。次に、それらのコンテンツを比較して、同じかどうかを確認します。同じ場合は、古い実際の DOM を再利用してパフォーマンスを節約できます。

React でインデックスをキーとして使用することが推奨されない理由についての説明はこれで終わりです。React のインデックスをキーとして使用することに関するより関連性の高いコンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Vue で v-for を使用するときに、インデックスをキーとして使用できないのはなぜですか?
  • Vue でインデックスをキーとして使用すべきでない理由の詳細な説明 (diff アルゴリズム)
  • vue2.0 で削除または変更された項目 (インデックス キーが削除されました)

<<:  MySQLテーブルの内容の変更を監視し、MySQL binlogを有効にする

>>:  Linuxでホスト名を変更する方法

推薦する

星のきらめき効果を実現するネイティブ js

この記事の例では、星のきらめき効果を実現するためのjsの具体的なコードを共有しています。具体的な内容...

カルーセル効果を書くためのjs

この記事では、カルーセルマップの効果を実現するためのjsの具体的なコードを参考までに共有します。具体...

Vueはタブ切り替えを実装します

この記事では、タブ切り替えを実装するためのVueの具体的なコードを例として紹介します。具体的な内容は...

clearfixとclearの例

この記事では、CSS を理解し始めたばかりの人を対象に、主に HTML で clearfix と c...

SQL Server データベース エラー 5123 の解決方法

なぜなら、SQL Server 2005 に基づくデータベース チュートリアルがあり、そこで使用され...

Macにmysql5.7.18をインストールする詳細な手順

1. ツール今必要なツールは2つあります: MySQLサーバー (mysql-5.7.18)、MyS...

Promiseの紹介と基本的な使い方の簡単な分析

Promise は、ES6 で導入された非同期プログラミングのための新しいソリューションです。 Pr...

CSS XTHML の記述標準とよくある問題の概要 (ページ最適化)

プロジェクトドキュメントディレクトリDiv+CSS 命名規則 - 4 - Div+css 命名規則 ...

HTML ウェブページでのアンカー(名前付きアンカー)の使用の概要

以下の情報はインターネットから収集したものです1. アンカーは、Web ページ作成におけるハイパーリ...

フォーム要素の垂直方向の中央揃えに最適なソリューション

コードをコピーコードは次のとおりです。 <!DOCTYPE html PUBLIC "...

MySQL トランザクション、分離レベル、ロックの使用例の分析

この記事では、例を使用して、MySQL トランザクション、分離レベル、およびロックの使用について説明...

Vue ログインページでクッキーを使用してパスワードを 7 日間記憶する方法

問題の説明プロジェクトのログインページでは、7日間パスワードを記憶する必要がある機能があります。この...

MySQL 8.0.22 解凍版インストールチュートリアル(初心者向け)

目次1. リソースのダウンロード2. ソフトウェアを解凍する2.1 場所を選択する2.2 名前を変更...

Dockerコンテナを使用してホストネットワークにアクセスする方法

最近、nginx をリバース プロキシとして使用し、docker で nginx を実行するシステム...

MySQL の遅いクエリ操作の例の分析 [有効化、テスト、確認など]

この記事では、MySQL のスロー クエリ操作について例を挙げて説明します。ご参考までに、詳細は以下...