In React, useEffect is the go-to hook for managing side effects—actions that happen outside the normal component rendering flow.
If you're fetching data, setting up a subscription, manually changing the DOM, or working with timers, you’re in useEffect territory.
✅ What is useEffect Used For?
React's rendering is pure, but sometimes you need to:
- Fetch data from an API
- Set up a
setIntervalorsetTimeout - Attach or clean up event listeners
- Sync component state with
localStorageor the URL
useEffect lets you run code after the DOM is updated.
🧠 Example
useEffect(() => {
console.log("Component mounted!");
return () => console.log("Component will unmount!");
}, []);
Explanation
- The
[]dependency array means it runs only once (likecomponentDidMountin class components). - The returned function is the cleanup function, like
componentWillUnmount.
🔄 When Does useEffect Run?
| Dependency Array | Behavior |
|---|---|
[] |
Run once on mount |
[someVar] |
Run on the mount, and when someVar changes |
| (no array) | Run after every render |
🚫 Common Mistakes with useEffect
- Forgetting the dependency array → causes infinite loops
- Incorrect dependencies → can cause stale data or unnecessary re-renders
- Updating state inside
useEffectwithout guard conditions → can cause render loops
🛠️ Pro Tip
Use the React DevTools to debug hooks and watch when your effects fire. You can also create custom hooks (e.g. useFetch) to abstract effect logic.

Join the conversation! Your thoughts help the community grow.