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) => {