HOOKs IN REACT
HOOKs IN REACT
1. useState Hook
What it does?
It lets you add state (data that changes) to your function component.
function Counter() {
const [count, setCount] = useState(0);
// useState(0) initializes "count" with 0 and "setCount" is used
to update it.
return (
<div>
<p>Count: {count}</p> {/* Show the current count */}
<button onClick={() => setCount(count + 1)}>Increment</button>
{/* When clicked, increase count by 1 */}
</div>
);
}
What it does?
It lets you run code when the component loads, updates, or unmounts. (Used
for API calls, timers, etc.)
function Timer() {
const [time, setTime] = useState(0); // Start time at 0
useEffect(() => {
const interval = setInterval(() => setTime(time + 1), 1000);
// Every 1 second, increase time by 1
return () => clearInterval(interval); // Clean up timer when
component unmounts
}, [time]); // Runs every time "time" changes
What it does?
It lets you share data (like themes, user info) between components without
passing props.
function ThemeComponent() {
const theme = useContext(ThemeContext); // Get theme value from
context
return <p>Current Theme: {theme}</p>; // Show current theme
}
What it does?
It stores a reference to an element or value without causing re-renders.
function InputFocus() {
const inputRef = useRef(null); // Create a reference
return (
<div>
<input ref={inputRef} type="text" placeholder="Type
something..." />
<button onClick={focusInput}>Focus Input</button>
{/* Clicking this focuses input */}
</div>
);
}
What it does?
It is like useState but better for managing complex state (like counters, forms).
function Counter() {
const [state, dispatch] = useReducer(reducer, { count: 0 });
// useReducer(reducer, initialState)
return (
<div>
<p>Count: {state.count}</p>
<button onClick={() => dispatch({ type: "increment"
})}>+</button>
<button onClick={() => dispatch({ type: "decrement" })}>-
</button>
</div>
);
}
What it does?
It optimizes performance by caching expensive calculations.
function App() {
const [number, setNumber] = useState(2);
return (
<div>
<button onClick={() => setNumber(number +
1)}>Increase</button>
<ExpensiveCalculation num={number} />
</div>
);
}
What it does?
It memoizes functions to prevent unnecessary re-creation.
function App() {
const [count, setCount] = useState(0);
return (
<div>
<p>Count: {count}</p>
<Button handleClick={increment} />
</div>
);
}
What it does?
Like useEffect, but runs before the screen updates.
function LayoutEffectExample() {
const [color, setColor] = useState("red");
useLayoutEffect(() => {
setColor("blue"); // Updates before painting the screen
}, []);
What it does?
It customizes what a ref exposes.
function Parent() {
const inputRef = useRef(null);
return (
<div>
<CustomInput ref={inputRef} />
<button onClick={() => inputRef.current.focus()}>Focus
Input</button>
</div>
);
}
What it does?
It generates unique IDs for accessibility.
function Form() {
const id = useId();
return (
<div>
<label htmlFor={id}>Enter Name: </label>
<input id={id} type="text" />
</div>
);
}
Conclusion
• useState → Manages state
• useEffect → Runs side effects
• useContext → Shares data
• useRef → References elements
• useReducer → Manages complex state
• useMemo → Optimizes calculations
• useCallback → Optimizes functions
• useLayoutEffect → Runs before paint
• useImperativeHandle → Controls ref exposure
• useId → Generates unique IDs