diff --git a/packages/plugins/eslint-plugin-react-x/src/rules/no-unnecessary-key.spec.ts b/packages/plugins/eslint-plugin-react-x/src/rules/no-unnecessary-key.spec.ts
index d7bd5e4dd..a2ccff16b 100644
--- a/packages/plugins/eslint-plugin-react-x/src/rules/no-unnecessary-key.spec.ts
+++ b/packages/plugins/eslint-plugin-react-x/src/rules/no-unnecessary-key.spec.ts
@@ -79,5 +79,13 @@ ruleTester.run(RULE_NAME, rule, {
tsx`
`,
+ // Valid: not a list rendering context
+ tsx`
+ things.map(thing => {
+ function NestedComponent() {
+ return ;
+ }
+ })
+ `,
],
});
diff --git a/packages/plugins/eslint-plugin-react-x/src/rules/no-unnecessary-key.ts b/packages/plugins/eslint-plugin-react-x/src/rules/no-unnecessary-key.ts
index a0c90b634..f274dd585 100644
--- a/packages/plugins/eslint-plugin-react-x/src/rules/no-unnecessary-key.ts
+++ b/packages/plugins/eslint-plugin-react-x/src/rules/no-unnecessary-key.ts
@@ -35,16 +35,14 @@ export default createRule<[], MessageID>({
});
export function create(context: RuleContext): RuleListener {
- if (!context.sourceCode.getText().includes("key=")) {
- return {};
- }
-
+ if (!context.sourceCode.text.includes("key=")) return {};
return {
JSXAttribute(node: TSESTree.JSXAttribute) {
if (node.name.name !== "key") return;
const jsxElement = node.parent.parent;
+ const initialScope = context.sourceCode.getScope(jsxElement);
const pMapCallback = AST.findParentNode(jsxElement, isMapCallback);
- if (pMapCallback == null) return;
+ if (pMapCallback == null || context.sourceCode.getScope(pMapCallback) !== initialScope) return;
const pKeyedElementOrElse = AST.findParentNode(
jsxElement,
(n) => {