keyの警告が出る理由とその対処法
リストレンダリング時に出る「key」警告の原因と正しい指定方法
⚠️ 警告メッセージ
Warning: Each child in a list should have a unique "key" prop.
これは、Reactで配列を .map()
などでレンダリングする際に、key属性を正しく指定していないと発生する警告です。
❓ なぜ key が必要?
- ReactはDOMの差分を高速に検出(=再描画の最適化)するために、各要素を一意に識別したい。
- keyがない or 重複していると、Reactは同じコンポーネントを別物として扱ってしまう可能性がある。
❌ NG例:keyが指定されていない
const items = ['Apple', 'Banana', 'Orange']
return (
<ul>
{items.map((item) => (
<li>{item}</li> // ← keyなし
))}
</ul>
)
✅ OK例:一意のkeyを指定する
return (
<ul>
{items.map((item) => (
<li key={item}>{item}</li>
))}
</ul>
)
文字列・IDなど一意性のある値を使うのが原則です。
⚠️ indexをkeyに使うのはアリ?
{items.map((item, index) => (
<li key={index}>{item}</li> // indexをkeyにしている
))}
✅ 適しているケース:
- リストが 一度きりで変化しない(追加/削除/並び替えなし)
❌ 適していないケース:
- リストの要素が 頻繁に入れ替わる・変更される場合
→ 意図しない再描画や状態のずれが起きる可能性あり
💡 よくある間違いと対策
状況 | NG例 | 対策 |
---|---|---|
重複した値をkeyにしている | key={item.category} |
id など一意な値を使う |
map()で複数コンポーネントを返す | <><Component /><Component /></> |
Fragment にも key をつける必要があることも |
keyを親に書いて子を返してる | key が子に反映されず効果がない |
.map() の直下の要素にkeyを指定する必要あり |
🧪 デバッグのヒント
- コンソールの警告ログに
"key"
と出たら必ずチェック - 開発ツールで「DOMが勝手に消える・再描画される」などの症状が出たら疑う
✅ まとめ:keyの正しい使い方
ルール | 説明 |
---|---|
一意の値を使う | idやUUIDなどが理想 |
配列のindexは極力避ける | 安定しない並び順だとバグの元に |
警告が出たら無視しない | 再描画やアニメーションに影響する |
keyは要素のルート(最上位)に指定する | Fragmentやdivなどmap直下に書く |
🔗 参考