--- title: component-hook-factories --- Validates against higher order functions defining nested components or hooks. Components and hooks should be defined at the module level. This rule is available in `eslint-plugin-react-hooks` v6. ## Rule Details {/*rule-details*/} Defining components or hooks inside other functions creates new instances on every call. React treats each as a completely different component, destroying and recreating the entire component tree, losing all state, and causing performance problems. ### Invalid {/*invalid*/} Examples of incorrect code for this rule: ```js {expectedErrors: {'react-compiler': [14]}} // ❌ Factory function creating components function createComponent(defaultValue) { return function Component() { // ... }; } // ❌ Component defined inside component function Parent() { function Child() { // ... } return ; } // ❌ Hook factory function function createCustomHook(endpoint) { return function useData() { // ... }; } ``` ### Valid {/*valid*/} Examples of correct code for this rule: ```js // ✅ Component defined at module level function Component({ defaultValue }) { // ... } // ✅ Custom hook at module level function useData(endpoint) { // ... } ``` ## Troubleshooting {/*troubleshooting*/} ### I need dynamic component behavior {/*dynamic-behavior*/} You might think you need a factory to create customized components: ```js // ❌ Wrong: Factory pattern function makeButton(color) { return function Button({children}) { return ( ); }; } const RedButton = makeButton('red'); const BlueButton = makeButton('blue'); ``` Pass [JSX as children](/learn/passing-props-to-a-component#passing-jsx-as-children) instead: ```js // ✅ Better: Pass JSX as children function Button({color, children}) { return ( ); } function App() { return ( <> ); } ```