Closed5

Next.js:npm run buildするときにESLintで「Error: Missing "key" prop for element in iterator」が発生、その対処について

たくろーどんたくろーどん

Next.jsをつかったWebアプリケーションをつくっているときに直面した問題です。
下記のコマンドをつかいESLintを含めた状態でWebアプリケーションを作成した。

npx create-next-app@latest

https://nextjs.org/docs/api-reference/create-next-app

そして下記のコマンド実行時に

npm run build

ESLintでこのようなエラーが発生した。

Error: Missing "key" prop for element in iterator
たくろーどんたくろーどん

公式ドキュメントではkeyについて、このように説明があります。

Keys help React identify which items have changed, are added, or are removed. Keys should be given to the elements inside the array to give the elements a stable identity.
キーは、どの項目が変更、追加、または削除されたかを React が識別するのに役立ちます。要素に安定したアイデンティティを与えるために、配列内の要素にキーを与える必要があります。

また下記のような記述も見られました。

A good rule of thumb is that elements inside the map() call need keys.
経験則として、map()呼び出し内の要素にはキーが必要です。

https://ja.reactjs.org/docs/lists-and-keys.html#keys

たくろーどんたくろーどん

作成したソースコードを見返してみると、map関数を使っている箇所でkeyの指定が抜けていました。
map関数で展開したindexkeyに割り当てたところ、本題のESLintのエラーが解決しました。

変更前
{users.map((user, index) => (
                        <Input user={user} ref={{
                             // ...省略...
                        }} />
                    ))}
変更後
{users.map((user, index) => (
                        <Input key={index} user={user} ref={{
                             // ...省略...
                        }} />
                    ))}
たくろーどんたくろーどん

ただし、こちらの記事で指摘されているようにkeyindexをつかうと不都合が起こる場合もあるようです。必ずしも使ってはいけないというわけではないですが、アンチパターンであることを記憶にとどめておきたいと思います。

https://zenn.dev/luvmini511/articles/f7b22d93e9c182

このスクラップは2023/01/05にクローズされました