--- 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.