React
UseEffect
Functional Components
React Hooks
JavaScript
Frontend Development
Web Development

How to Understand UseEffect Lifecycle in Functional React

Listen to article
Deepak Tewatia
September 24, 2025
4 min read

Introduction

Understanding the useEffect hook in React can be simple. It helps you run code when your component shows up or changes. You can think of it like a helper that watches for updates. This guide will explain how to use it step by step so you can manage your app's behavior easily.

What is useEffect?

The useEffect hook is one of the most important tools in React. It allows you to perform side effects in your functional components. Side effects can be anything from fetching data to directly interacting with the DOM. In class components, you used lifecycle methods like componentDidMount and componentDidUpdate. With functional components, useEffect takes over these tasks.

How useEffect Works

Here’s the thing: useEffect runs after every render of your component. This is true by default, which means it runs after the first render and any time the component updates. But you can control when it runs by passing in a second argument, an array of dependencies.

Basic Syntax

Let’s break it down with some code. Here’s how you might set up a basic useEffect hook:

<code class="javascript">useEffect(() => {
    // Your code here
}, [/* dependencies */]);

Example: Fetching Data

Let’s look at a common example: fetching data. You want to get data when the component mounts. Here’s how you can do it:

<code class="javascript">import React, { useEffect, useState } from 'react';

function DataFetchingComponent() {
    const [data, setData] = useState(null);

    useEffect(() => {
        fetch('https://api.example.com/data')
            .then(response => response.json())
            .then(data => setData(data));
    }, []); // Empty array means run once when component mounts

    return (
        <div>
            {data ? <pre>{JSON.stringify(data, null, 2)}

 :

Loading...

} ); }

In this code, we use useEffect to fetch data when the component first appears. The empty array as a second argument tells React to run this effect only once.

Cleanup Function

Sometimes you need to clean up after effects. For example, if you're setting up a subscription or a timer, you want to stop it when the component unmounts. You can return a cleanup function from useEffect like this:

<code class="javascript">useEffect(() => {
    const timer = setTimeout(() => {
        console.log('Timer has ended');
    }, 1000);

    return () => clearTimeout(timer); // Cleanup
}, []);

In this code, the cleanup function runs when the component unmounts, preventing memory leaks or unwanted behavior.

Dependencies Explained

Now, let's talk about the dependency array. This is where you specify what should trigger the effect when changed. For example, if you want to fetch data whenever a user changes their ID, you can do this:

<code class="javascript">const [userId, setUserId] = useState(1);

useEffect(() => {
    fetch(`https://api.example.com/user/${userId}`)
        .then(response => response.json())
        .then(user => setUser(user));
}, [userId]); // Runs every time userId changes

By adding userId in the array, React knows to rerun this effect whenever userId changes.

Common Mistakes

Even experienced developers make mistakes with useEffect. Here are some common pitfalls:

  • Missing dependencies: If you forget to include a variable in the dependency array, React won't know to rerun the effect when that variable changes.
  • Uncontrolled side effects: Make sure your effects don't cause unexpected behavior. This can happen if you depend on stale props or state.
  • Infinite loops: Be careful with effects that update state. If the state variable you are updating is also in your dependency array, it can cause an endless render loop.

Conclusion

What this really means is that useEffect is a powerful tool in your React belt. It helps you manage side effects, clean up resources, and coordinate updates based on specific changes. By mastering it, you can create smoother and more efficient applications. Remember to keep your dependency arrays in check and always consider cleanup to avoid messy code. Happy coding!

Comments

Y
You
Commenting
0/2000
Loading comments…