How to code is executed in a react component during rendering
On each render of a component, the entire function body of the component is executed. This includes:
- The
returnblock which returns the JSX. - Any event handlers defined within the component.
- All other code within the component function except the state initialization by
useStateand other hooks that manage their internal state across renders.
However, React ensures that certain hooks like useState, useEffect, etc., behave in a consistent way across renders. Here’s a breakdown of what happens:
Detailed Breakdown
-
Function Body Execution:
- Every time the component re-renders, the entire function body is executed from top to bottom.
- This means any calculations, event handler definitions, or other logic within the component function are re-executed.
-
Hooks Behavior:
- Hooks like
useStateanduseEffectare called in the same order on every render. - The
useStatehook does not reinitialize state; it returns the current state and the state setter function. - Other hooks (
useEffect,useMemo,useCallback, etc.) also have specific behaviors to manage their lifecycles and dependencies.
- Hooks like
Example
Here’s an example to illustrate what gets executed on each render:
import React, { useState, useEffect } from 'react';
const Counter = () => {
console.log('Component rendering');
const [count, setCount] = useState(() => {
console.log('Initializing state');
return 0;
});
const handleClick = () => {
setCount(count + 1);
};
useEffect(() => {
console.log('Effect running');
return () => {
console.log('Effect cleanup');
};
}, [count]);
console.log('Before return');
return (
<div>
<p>Count: {count}</p>
<button onClick={handleClick}>Increment</button>
</div>
);
};
export default Counter;
Explanation
-
Initial Render:
console.log('Component rendering'): Logs every render.useStateinitializer logs "Initializing state" only once.console.log('Before return'): Logs before returning the JSX.- The
returnblock returns the JSX to be rendered. - The
useEffecthook runs the effect and logs "Effect running". No cleanup on initial render.
-
Subsequent Renders:
- When
setCountis called, it triggers a re-render. - The entire component function executes again.
console.log('Component rendering'): Logs every render.useStatedoes not log "Initializing state" again because it retains the state across renders.console.log('Before return'): Logs before returning the JSX.- The
returnblock returns the JSX to be rendered. - The
useEffectcleanup runs if dependencies have changed, logging "Effect cleanup". - The
useEffecteffect runs again if dependencies have changed, logging "Effect running".
- When
Published on: Jul 05, 2024, 05:48 AM