Reactのkeyプロップが必要な理由
コンソールに次のようなエラーが表示されることがあります:「Each child in a list should have a unique 'key' prop.(リスト内の各子要素は、一意の 'key' プロップを持つ必要があります。)」
多くの開発者がこれを無視してしまいますが、それは間違いです。この警告は、パフォーマンスの問題や潜在的なバグを知らせてくれるものです。
keyプロップとは?
keyプロップは、Reactがリスト内の特定のアイテムを識別するのに役立ちます。どのアイテムが変更、移動、または削除されたのかをReactに伝えます。keyがないと、何かが変更されるたびにReactはリスト全体を再レンダリングしてしまいます。これにより、アプリの動作が遅くなります。
1000冊の本がある図書館を想像してみてください。もし途中に新しい本を1冊追加しようとしたら、スペースを作るために他のすべての本を移動させなければなりません。keyは、各書籍に対する一意のIDのような役割を果たします。これにより、Reactは他のすべてを動かすことなく、正確な場所を見つけることができるのです。
Reconciliation(再調和)のプロセス
Reactは、新しいVirtual DOMと古いDOMを比較するために、ディフィング(diffing)アルゴリズムを使用します。
- ステート(状態)が変化する。
- Reactが新しいツリーを構築する。
- Reactがkeyを使用してツリーを比較する。
- Reactは変更された要素のみを更新する。
よくある間違い:配列のインデックスをkeyとして使用すること
リストの内容が変化する場合は、決して key={index} を使用しないでください。アイテムを追加または削除すると、すべてのアイテムのインデックスがずれてしまいます。するとReactが混乱し、実際には変更されていないアイテムまで再レンダリングしてしまいます。これはメモリの無駄遣いとなり、UIのバグを引き起こします。
修正方法:
- データベースの安定したID(
user.idなど)を使用する。 - データにIDがない場合は、
uuidのような一意の文字列を使用する。 - keyに
Math.random()を使用するのは避ける。レンダリングのたびに新しいIDが生成されるため、コンポーネントの再マウントが強制され、UIのちらつきの原因となります。
ベストプラクティス:
- Keyは安定している必要があります。
- Keyは兄弟要素間で一意である必要があります。
- 最良のパフォーマンスを得るために、データベースのIDを使用してください。
keyの比較表:
• データベースID:推奨。安定しており高速。 • 配列のインデックス:非推奨。ソートやフィルタリングの際にバグの原因となります。 • Math.random():避けるべき。不要な再マウントを引き起こします。
ワークフローのまとめ:
もしこのエラーが表示されたら、コンポーネントに永続的な識別子が不足しています。APIのレスポンスに、emailやIDのような一意のフィールドがないか確認してください。これを修正することで、不要な再レンダリングを30〜40%削減できます。
