--- title: React calls Components and Hooks --- React is responsible for rendering components and Hooks when necessary to optimize the user experience. It is declarative: you tell React what to render in your component’s logic, and React will figure out how best to display it to your user. --- ## Never call component functions directly {/*never-call-component-functions-directly*/} Components should only be used in JSX. Don't call them as regular functions. React should call it. React must decide when your component function is called [during rendering](/reference/rules/components-and-hooks-must-be-pure#how-does-react-run-your-code). In React, you do this using JSX. ```js {2} function BlogPost() { return
; // ✅ Good: Only use components in JSX } ``` ```js {expectedErrors: {'react-compiler': [2]}} {2} function BlogPost() { return {Article()}; // 🔴 Bad: Never call them directly } ``` If a component contains Hooks, it's easy to violate the [Rules of Hooks](/reference/rules/rules-of-hooks) when components are called directly in a loop or conditionally. Letting React orchestrate rendering also allows a number of benefits: * **Components become more than functions.** React can augment them with features like _local state_ through Hooks that are tied to the component's identity in the tree. * **Component types participate in reconciliation.** By letting React call your components, you also tell it more about the conceptual structure of your tree. For example, when you move from rendering `` to the `` page, React won’t attempt to re-use them. * **React can enhance your user experience.** For example, it can let the browser do some work between component calls so that re-rendering a large component tree doesn’t block the main thread. * **A better debugging story.** If components are first-class citizens that the library is aware of, we can build rich developer tools for introspection in development. * **More efficient reconciliation.** React can decide exactly which components in the tree need re-rendering and skip over the ones that don't. That makes your app faster and more snappy. --- ## Never pass around Hooks as regular values {/*never-pass-around-hooks-as-regular-values*/} Hooks should only be called inside of components or Hooks. Never pass it around as a regular value. Hooks allow you to augment a component with React features. They should always be called as a function, and never passed around as a regular value. This enables _local reasoning_, or the ability for developers to understand everything a component can do by looking at that component in isolation. Breaking this rule will cause React to not automatically optimize your component. ### Don't dynamically mutate a Hook {/*dont-dynamically-mutate-a-hook*/} Hooks should be as "static" as possible. This means you shouldn't dynamically mutate them. For example, this means you shouldn't write higher order Hooks: ```js {expectedErrors: {'react-compiler': [2, 3]}} {2} function ChatInput() { const useDataWithLogging = withLogging(useData); // 🔴 Bad: don't write higher order Hooks const data = useDataWithLogging(); } ``` Hooks should be immutable and not be mutated. Instead of mutating a Hook dynamically, create a static version of the Hook with the desired functionality. ```js {2,6} function ChatInput() { const data = useDataWithLogging(); // ✅ Good: Create a new version of the Hook } function useDataWithLogging() { // ... Create a new version of the Hook and inline the logic here } ``` ### Don't dynamically use Hooks {/*dont-dynamically-use-hooks*/} Hooks should also not be dynamically used: for example, instead of doing dependency injection in a component by passing a Hook as a value: ```js {expectedErrors: {'react-compiler': [2]}} {2} function ChatInput() { return