ReactJS - キー: 効率的なリストレンダリングのパワーを解き放つ

こんにちは、未来のReactスーパースターたち!今日は、Reactの中でも最も重要な概念の1つであるキーについて深く掘り下げます。プログラミングが初めての方也不用担心——私はこれまでに数多くの学生を指導してきましたので、ステップバイステップで説明します。コーヒー(またはお好みでティー)を片手に、このエキサイティングな旅に一緒に参加してください!

ReactJS - Keys

リストとキーの理解

Reactでのリストとは?

キーに入る前に、まずリストについて話しましょう。Reactでは、ページ上に複数の似たようなアイテムを表示する必要があります。たとえば、TODOリスト、ショッピングカート、またはお気に入りの映画のリストなどです。Reactでは、これらのリストをJavaScriptの配列で表現し、コンポーネント内でレンダリングします。

簡単な例を見てみましょう:

function MovieList() {
const movies = ['Inception', 'Interstellar', 'The Dark Knight'];

return (
<ul>
{movies.map(movie => <li>{movie}</li>)}
</ul>
);
}

このコードでは、map関数を使用して、映画のタイトルの配列を<li>要素の配列に変換しています。すごいでしょう?

キープロパティの導入

このコードを実行すると、コンソールに警告が表示されるかもしれません:

Warning: Each child in a list should have a unique "key" prop.

ここで私たちのスターが登場します——keyプロパティ!

キーとは?

キーは、Reactがリスト内のどのアイテムが変更された、追加された、または削除されたかを特定するのに役立つ特別な文字列属性です。リストの各アイテムにユニークな名札を与えるようなものです。

前の例を修正してキーを含めるようにします:

function MovieList() {
const movies = [
{ id: 1, title: 'Inception' },
{ id: 2, title: 'Interstellar' },
{ id: 3, title: 'The Dark Knight' }
];

return (
<ul>
{movies.map(movie => <li key={movie.id}>{movie.title}</li>)}
</ul>
);
}

今、各<li>要素にユニークなkeyプロパティがあります。Reactはこれらのキーを使用して、リストが変更されたときに効率的に更新します。

キーの魔法

なぜキーが重要か?

あなたが教師(私のように)で、クラスにたくさんの生徒がいるとします。生徒の出席を迅速に取りたいとき、各生徒にユニークなID番号があると簡単ですよね?これがキーがReactにとって何をしているか exactに同じです。

キーはReactに以下のことを助けます:

  1. 変更された、追加された、または削除されたアイテムを特定する
  2. 再レンダリング間でコンポーネントの状態を保持する
  3. DOM操作を最小限に抑えることでパフォーマンスを向上させる

正しいキーの選択

では、あなたはおそらく「どのようなキーを使用すればいいのか」と思っているかもしれません。素晴らしい質問です!以下に分解します:

  1. ユニークで安定したIDを使用する:データがデータベースから取得されている場合は、アイテムのIDをキーとして使用します。
<li key={item.id}>{item.name}</li>
  1. インデックスを使用するのは最後の手段として:安定したIDがない場合は、配列内のアイテムのインデックスを使用しますが、リストが並び替えられる場合には問題が発生する可能性があります。
{items.map((item, index) => <li key={index}>{item.name}</li>)}
  1. ユニークなキーを生成する:アイテムを即座に作成する場合は、uuidなどのパッケージを使用してユニークなキーを生成します。
import { v4 as uuidv4 } from 'uuid';

{items.map(item => <li key={uuidv4()}>{item.name}</li>)}

キーとインデックス: 更に詳しく

基本を理解したので、インデックスを使用する方法についてさらに詳しく見てみましょう。

インデックスをキーとして使用する場合

インデックスをキーとして使用することは魅力的ですが、以下の条件を満たす場合に限ります:

  1. リストが静的で変更されない
  2. リストのアイテムに安定したIDがない
  3. リストが並び替えられたりフィルタリングされたりしない

以下はインデックスをキーとして使用する場合の例です:

function StaticList() {
const items = ['Apple', 'Banana', 'Cherry'];

return (
<ul>
{items.map((item, index) => <li key={index}>{item}</li>)}
</ul>
);
}

インデックスを使用する落とし穴

より動的な例を見て、なぜインデックスを使用するのが問題になるのか理解しましょう:

function DynamicList() {
const [items, setItems] = useState(['Item 1', 'Item 2', 'Item 3']);

const addItem = () => {
setItems(['New Item', ...items]);
};

return (
<>
<button onClick={addItem}>Add Item</button>
<ul>
{items.map((item, index) => (
<li key={index}>
{item}
<input type="text" />
</li>
))}
</ul>
</>
);
}

この例では、新しいアイテムを追加して入力フィールドに何かを入力した場合、入力値が混ざることに気づくでしょう。これはReactがインデックスを使用してキーとしているためです。

より良いアプローチ

この問題を解決するためには、各アイテムに安定したユニークな識別子を使用する必要があります:

function DynamicList() {
const [items, setItems] = useState([
{ id: 1, text: 'Item 1' },
{ id: 2, text: 'Item 2' },
{ id: 3, text: 'Item 3' }
]);

const addItem = () => {
const newItem = { id: Date.now(), text: 'New Item' };
setItems([newItem, ...items]);
};

return (
<>
<button onClick={addItem}>Add Item</button>
<ul>
{items.map(item => (
<li key={item.id}>
{item.text}
<input type="text" />
</li>
))}
</ul>
</>
);
}

今、新しいアイテムを追加したりリストを並び替えたりしても、Reactは各アイテムを正しく追跡できます。

結論

おめでとうございます!Reactのキーのパワーを解き放ちました。忘れないでください——キーはリストのアイテムに名札を与えるものです。Reactはそれを使用して、アイテムが動き始めたときに何をどのように管理するかを知ることができます。

以下是我们今天学到的内容的一个快速总结:

概念 説明
キー Reactのリストアイテムのための特別な文字列属性
目的 リストの変更を効率的に特定するのを助ける
最善の実践 安定したユニークな識別子をキーとして使用する
インデックスをキーとして使用する 静的で変更されないリストにのみ使用する
利点 パフォーマンスの向上とコンポーネントの状態の維持

キーを練習し続けると、すぐにプロのように動的な、効率的なReactアプリケーションを作成できるようになります!ハッピーコーディングを、そして——Reactの世界では、各アイテムには独自のキーが必要です!

Credits: Image by storyset