---
title: static-components
---
Validates that components are static, not recreated every render. Components that are recreated dynamically can reset state and trigger excessive re-rendering.
## Rule Details {/*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 {/*invalid*/}
Examples of incorrect code for this rule:
```js
// ❌ Component defined inside component
function Parent() {
const ChildComponent = () => { // New component every render!
const [count, setCount] = useState(0);
return ;
};
return ; // State resets every render
}
// ❌ Dynamic component creation
function Parent({type}) {
const Component = type === 'button'
? () =>
: () =>
Text
;
return ;
}
```
### Valid {/*valid*/}
Examples of correct code for this rule:
```js
// ✅ Components at module level
const ButtonComponent = () => ;
const TextComponent = () =>
Text
;
function Parent({type}) {
const Component = type === 'button'
? ButtonComponent // Reference existing component
: TextComponent;
return ;
}
```
## Troubleshooting {/*troubleshooting*/}
### I need to render different components conditionally {/*conditional-components*/}
You might define components inside to access local state:
```js {expectedErrors: {'react-compiler': [13]}}
// ❌ Wrong: Inner component to access parent state
function Parent() {
const [theme, setTheme] = useState('light');
function ThemedButton() { // Recreated every render!
return (
);
}
return ;
}
```
Pass data as props instead:
```js
// ✅ Better: Pass props to static component
function ThemedButton({theme}) {
return (
);
}
function Parent() {
const [theme, setTheme] = useState('light');
return ;
}
```
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.