Validates that components are static, not recreated every render. Components that are recreated dynamically can reset state and trigger excessive re-rendering.
Rule Details
Section titled “Rule Details”Components defined inside other components are recreated on every render. React sees each as a brand new component type, unmounting the old one and mounting the new one, destroying all state and DOM nodes in the process.
Invalid
Section titled “Invalid”Examples of incorrect code for this rule:
// ❌ Component defined inside componentfunction Parent() { const ChildComponent = () => { // New component every render! const [count, setCount] = useState(0); return <button onClick={() => setCount(count + 1)}>{count}</button>; };
return <ChildComponent />; // State resets every render}
// ❌ Dynamic component creationfunction Parent({type}) { const Component = type === 'button' ? () => <button>Click</button> : () => <div>Text</div>;
return <Component />;}Examples of correct code for this rule:
// ✅ Components at module levelconst ButtonComponent = () => <button>Click</button>;const TextComponent = () => <div>Text</div>;
function Parent({type}) { const Component = type === 'button' ? ButtonComponent // Reference existing component : TextComponent;
return <Component />;}Troubleshooting
Section titled “Troubleshooting”I need to render different components conditionally
Section titled “I need to render different components conditionally”You might define components inside to access local state:
// ❌ Wrong: Inner component to access parent statefunction Parent() { const [theme, setTheme] = useState('light');
function ThemedButton() { // Recreated every render! return ( <button className={theme}> Click me </button> ); }
return <ThemedButton />;}Pass data as props instead:
// ✅ Better: Pass props to static componentfunction ThemedButton({theme}) { return ( <button className={theme}> Click me </button> );}
function Parent() { const [theme, setTheme] = useState('light'); return <ThemedButton theme={theme} />;}If you find yourself wanting to define components inside other components to access local variables, that’s a sign you should be passing props instead. This makes components more reusable and testable.