Mastering React useEffect Hook: A Comprehensive Guide

Shahmeer
5 min readMar 30, 2023

React’s useEffect hook is an essential feature of React that enables developers to handle side effects, such as updating the DOM, fetching data, or subscribing to events. The useEffect hook allows developers to manage component life cycles and execute code only when specific changes occur.

In this comprehensive guide, we will explore how to master React’s useEffect hook. We will cover everything from the basics to advanced techniques, including best practices and common pitfalls.

What is the useEffect hook?

The useEffect hook is a function provided by React that allows developers to perform side effects in function components. A side effect is anything that affects the outside world, such as updating the DOM, fetching data, or subscribing to events.

The useEffect hook is called after every render of a component, which makes it a perfect place to handle side effects. It allows you to manage component life cycles, such as mounting, updating, and unmounting.

How to use the useEffect hook?

Basic syntax

The basic syntax of the useEffect hook is as follows:

import { useEffect } from 'react';

function Example() {
useEffect(() => {
// Your code here
});
return null;
}

In this example, the useEffect hook is used inside a function component named Example. The useEffect hook takes a callback function as its argument, which will be executed after every render.

Running effects conditionally

You can also run the effect conditionally by passing a second argument to the useEffect hook. This argument is an array of dependencies that will trigger the effect when their values change.

import { useEffect, useState } from 'react';

function Example() {
const [count, setCount] = useState(0);
useEffect(() => {
document.title = `Count: ${count}`;
}, [count]);
return (
<div>
<p>Count: {count}</p>
<button onClick={() => setCount(count + 1)}>Increment</button>
</div>
);
}

In this example, the useEffect hook updates the document title only when the count state changes.

Cleaning up effects

Sometimes, you need to clean up the side effects when the component is unmounted or when the dependencies change. You can achieve this by returning a cleanup function from the useEffect hook.

import { useEffect, useState } from 'react';

function Example() {
const [count, setCount] = useState(0);
useEffect(() => {
const intervalId

In this example, the setInterval function is used to update the count state every second. The useEffect hook returns a cleanup function that clears the interval when the component is unmounted or when the count state changes.

Using multiple effects

You can use multiple effects in a single component by calling the useEffect hook multiple times.

import { useEffect, useState } from 'react';

function Example() {
const [count, setCount] = useState(0);
useEffect(() => {
console.log('Component mounted');
return () => {
console.log('Component unmounted');
};
}, []);
useEffect(() => {
document.title = `Count: ${count}`;
}, [count]);
return (
<div>
<p>Count: {count}</p>
<button onClick={() => setCount(count + 1)}>Increment</button>
</div>
);
}

In this example, two effects are used. The first effect logs a message when the component is mounted and returns a cleanup function that logs a message when the component is unmounted. The second effect updates the document title only when the count state changes.

Common use cases of useEffect hook

Updating the document title

Updating the document title is a common use case of the useEffect hook. You can update the document title by using the document.title property inside the effect function.

import { useEffect } from 'react';

function Example() {
useEffect(() => {
document.title = 'New Title';
}, []);
return null;
}

In this example, the document title is set to “New Title” when the component is mounted.

Fetching data from an API

Fetching data from an API is another common use case of the useEffect hook. You can fetch data by using the fetch API or any other library that supports fetching data.

import { useEffect, useState } from 'react';

function Example() {
const [data, setData] = useState(null);
useEffect(() => {
fetch('https://api.example.com/data')
.then(response => response.json())
.then(data => setData(data))
.catch(error => console.log(error));
}, []);
return (
<div>
{data ? <p>{data}</p> : <p>Loading...</p>}
</div>
);
}

In this example, the fetch function is used to fetch data from an API. The fetched data is stored in the data state, which is used to render the component.

Subscribing and unsubscribing to events

Subscribing and unsubscribing to events is another use case of the useEffect hook. You can subscribe to events by using the addEventListener function and unsubscribe by using the removeEventListener function.

import { useEffect } from 'react';

function Example() {
useEffect(() => {
const handleClick = () => console.log('Button clicked');
document.addEventListener('click', handleClick);
return () => {
document.removeEventListener('click', handleClick);
};
}, []);
return (
<button>Click me</button>
);
}

In this example, the addEventListener function is used to subscribe to the click event of the document. The removeEventListener function is used to unsubscribe from the event when the component is unmounted.

Animating components

Animating components is another use case of the useEffect hook. You can use CSS transitions or any other animation libraryto animate components. You can use the useEffect hook to add and remove classes to trigger animations.

import { useEffect, useState } from 'react';

function Example() {
const [isVisible, setIsVisible] = useState(false);
useEffect(() => {
setIsVisible(true);
}, []);
return (
<div className={`box ${isVisible ? 'visible' : ''}`}>
<p>Hello World!</p>
</div>
);
}

In this example, the isVisible state is used to toggle the visible class. The useEffect hook is used to set the isVisible state to true when the component is mounted.

Conclusion

The useEffect hook is an essential part of the React framework, and mastering it can significantly improve your development workflow. By using the useEffect hook, you can manage side effects, perform cleanup, and handle state changes in a declarative and composable way. With the knowledge you've gained from this comprehensive guide, you're now ready to take on more advanced use cases and build even more powerful and efficient React applications.

FAQs

1. What is the difference between useEffect and useLayoutEffect?

The main difference between useEffect and useLayoutEffect is that useEffect is asynchronous, while useLayoutEffect is synchronous. This means that useEffect will run after the browser has painted the screen, while useLayoutEffect will run before the browser has painted the screen.

2. How do you update state inside useEffect?

To update state inside useEffect, you need to call the state setter function returned by the useState hook. However, you need to be careful to avoid infinite loops by using the dependency array or adding the state setter function to the dependency array.

3. Can useEffect be used in class components?

No, useEffect is a hook that can only be used in function components. If you need to use side effects in class components, you can use the componentDidMount, componentDidUpdate, and componentWillUnmount lifecycle methods.

4. What is the dependency array in useEffect?

The dependency array is an optional second argument to the useEffect hook that specifies the dependencies of the effect. The effect function is only called when one of the dependencies changes.

5. What is the cleanup function in useEffect?

The cleanup function is a function returned by the effect function that is used to perform cleanup when the component is unmounted or when the dependencies of the effect change. The cleanup function can be used to remove event listeners, clear timers, or perform other cleanup tasks.

--

--

Shahmeer

Full stack developer passionate about building innovative solutions with React, Node, and TypeScript. Let's create something amazing together!