Math.random()はNG!Reactコンポーネントにキーを割り当てるべき方法
Reactコンポーネントにキーを割り当てる際に Math.random()
を使用するのは適切ですか?
詳細説明:
Math.random()
を使用してキーを生成すると、次の問題が発生する可能性があります。
- デバッグの難しさ
ランダムなキーは、デバッグを困難にする可能性があります。コンポーネントが再レンダリングされる理由を特定するのは難しくなり、問題の根本原因を突き止めるのに時間がかかる場合があります。 - パフォーマンスの問題
Math.random()
の呼び出しは、パフォーマンスに影響を与える可能性があります。特に、コンポーネントのリストが長い場合や、頻繁に更新される場合に顕著になります。 - キーの重複
2 つの異なるコンポーネントが同じランダムなキーを生成する可能性が常にあります。これは、React がコンポーネントを混同し、誤った更新につながる可能性があります。
代替手段:
Math.random()
の代わりに、キーを生成するために次の方法を使用することをお勧めします。
- ハッシュ関数
アイテムのデータに基づいてハッシュ値を生成するハッシュ関数を使用できます。これは、一意で予測可能なキーを生成するのに役立ちます。 - インデックス
リスト内のアイテムのインデックスをキーとして使用できます。ただし、これはキーを再利用できないため、キーの重複が発生する可能性があることに注意してください。 - アイテムの ID
各アイテムに一意の ID がある場合は、それをキーとして使用できます。これは、最も単純で効率的な方法の 1 つです。
import React from 'react';
const items = [
{ id: 1, name: 'Item 1' },
{ id: 2, name: 'Item 2' },
{ id: 3, name: 'Item 3' },
];
const MyList = () => {
return (
<ul>
{items.map((item) => (
<li key={Math.random() * 100000}>{item.name}</li>
))}
</ul>
);
};
ハッシュ関数を使用したキー生成
import React from 'react';
const items = [
{ id: 1, name: 'Item 1' },
{ id: 2, name: 'Item 2' },
{ id: 3, name: 'Item 3' },
];
const MyList = () => {
const hash = (item) => item.id.toString();
return (
<ul>
{items.map((item) => (
<li key={hash(item)}>{item.name}</li>
))}
</ul>
);
};
説明:
- ハッシュ関数を使用したキー生成の場合、
key
プロパティはアイテムのid
プロパティのハッシュ値に設定されます。 Math.random()
を使用したキー生成の場合、key
プロパティは 100000 までのランダムな値に設定されます。MyList
コンポーネントは、items
配列をイテレートし、各アイテムをli
要素としてレンダリングします。- 上記のコードは、
items
という名前の配列を定義します。この配列には、id
とname
のプロパティを持つオブジェクトが含まれています。
注意事項:
- キーは、コンポーネントの再レンダリングを最小限に抑えるためにできるだけ安定している必要があります。
- キー生成ロジックは、一意で予測可能なキーを生成する必要があります。
- 上記のコードはあくまで例であり、実際のアプリケーションでは状況に応じて調整する必要があります。
リスト内のアイテムのインデックスをキーとして使用できます。これは、最も単純でわかりやすい方法の 1 つですが、いくつかの制限があります。
- インデックスは、リスト内のアイテムの順序に依存します。アイテムの順序が変更されると、キーも変更する必要があります。
- キーを再利用できないため、キーの重複が発生する可能性があります。これは、アイテムがリストから削除されて再追加された場合に問題になる可能性があります。
インデックスを使用する例:
const items = [
{ name: 'Item 1' },
{ name: 'Item 2' },
{ name: 'Item 3' },
];
const MyList = () => {
return (
<ul>
{items.map((item, index) => (
<li key={index}>{item.name}</li>
))}
</ul>
);
};
GUID または UUID を使用する
グローバルに一意な ID を生成するために、GUID または UUID を使用できます。これにより、キーの重複を回避し、インデックスに依存しなくても済みます。ただし、GUID と UUID の生成には、パフォーマンス上のオーバーヘッドがかかる場合があります。
import { v4 as uuidv4 } from 'uuid';
const items = [
{ name: 'Item 1' },
{ name: 'Item 2' },
{ name: 'Item 3' },
];
const MyList = () => {
return (
<ul>
{items.map((item) => (
<li key={uuidv4()}>{item.name}</li>
))}
</ul>
);
};
カスタムキーロジックを使用する
上記のいずれの方法にも当てはまらない場合は、カスタム キー ロジックを使用できます。これは、アプリケーションに固有の要件がある場合に役立ちます。
カスタム キー ロジックを使用する例:
const items = [
{ id: 1, name: 'Item 1' },
{ id: 2, name: 'Item 2' },
{ id: 3, name: 'Item 3' },
];
const MyList = () => {
const getItemKey = (item) => `item-${item.id}`;
return (
<ul>
{items.map((item) => (
<li key={getItemKey(item)}>{item.name}</li>
))}
</ul>
);
};
最適な方法を選択する
使用するキー生成方法は、アプリケーションの要件によって異なります。一般的に、次のガイドラインに従うことをお勧めします。
- キーは生成しやすい必要があります。 キーの生成に複雑なロジックを使用すると、パフォーマンスが低下する可能性があります。
- キーはできるだけ安定している必要があります。 キーが頻繁に変更されると、パフォーマンスが低下する可能性があります。
- キーは一意で予測可能である必要があります。 これにより、React がコンポーネントを効率的に比較し、再レンダリングが必要かどうかを判断するのに役立ちます。
reactjs