no-missing-key
Disallows missing 'key' on items in list rendering.
Full Name in eslint-plugin-react-x
react-x/no-missing-keyFull Name in @eslint-react/eslint-plugin
@eslint-react/no-missing-keyPresets
x
recommended
recommended-typescript
recommended-type-checked
strict
strict-typescript
strict-type-checked
Rule Details
React needs keys to identify items in the list. If you don’t specify a key, React will use the array index as a key, which often leads to subtle and confusing bugs.
Examples
Missing key in list rendering
// Problem: When a key is missing, React uses the array index as the default key, which can lead to state mismatch or performance issues
interface MyComponentProps {
items: { id: number; name: string }[];
}
function MyComponent({ items }: MyComponentProps) {
return (
<ul>
{items.map((todo) => <Todo {...todo} />)}
</ul>
);
}Using a unique key in list rendering
// Recommended: Provide a stable and unique key for each item in the list to help React correctly track element identity
interface MyComponentProps {
items: { id: number; name: string }[];
}
function MyComponent({ items }: MyComponentProps) {
return (
<ul>
{items.map((todo) => <Todo key={todo.id} {...todo} />)}
</ul>
);
}Missing key when returning multiple elements per iteration
When you map over data and return multiple sibling elements, wrapping them in <></> loses the ability to assign a key. You must use the explicit Fragment syntax.
// Problem: Fragment shorthand (<>) does not support keys
function Blog({ posts }) {
return posts.map((post) => (
<>
<PostTitle title={post.title} />
<PostBody body={post.body} />
</>
));
}// Recommended: Use explicit Fragment with a key
import { Fragment } from "react";
function Blog({ posts }) {
return posts.map((post) => (
<Fragment key={post.id}>
<PostTitle title={post.title} />
<PostBody body={post.body} />
</Fragment>
));
}Versions
Resources
Further Reading
See Also
react-x/no-array-index-key
Disallows using an item's index in the array as its key.react-x/no-duplicate-key
Prevents duplicatekeyprops on sibling elements when rendering lists.react-x/no-implicit-key
Prevents implicitly passing thekeyprop to components.