React Hooks: Introduction to useCallback

Arian Garshi
3 min readJun 21, 2023

--

React Hooks make working with functional components in React much simpler. Most developers already use hooks like useState and useEffect, which handle state and side effects. However, React provides more hooks that can help us create better and more efficient web applications. One of these useful hooks is useCallback. a tool that helps optimize performance.

useCallback can optimize the performance of your React application by preventing unnecessary re-renders. It achieves this by "memorizing" a function and only re-creating it when one of its dependencies changes.

If you are familiar with the built-in hook useMemo, this explanation may give you Deja Vu. However, there is a key difference to the two. When using useMemo, you're memorizing a value that comes from a function. It helps avoid redoing complex calculations every time your component re-renders. Instead, it only recomputes the value when the dependencies you specify change.

On the other hand, with useCallback, you're memorizing an entire function. It prevents recreating the function instance on each render, which is useful when passing callbacks to child components. By memorizing the function, you ensure that child components don't unnecessarily re-render when the parent component re-renders due to other state changes.

How to use useCallback

Implementing this hook is fairly simple. It takes two arguments: the first is the function that you want to memorize, and the second is an array of dependencies. When one of these dependencies changes, the function is recreated. To dive into the syntax, let’s look at an example:

import React, { useState, useCallback } from 'react';

function App() {
const [count, setCount] = useState(0);
const [otherValue, setOtherValue] = useState(false);

const increment = useCallback(() => {
setCount(count + 1);
}, [count]);

return (
<div>
<button onClick={increment}>Increase</button>
<button onClick={() => setOtherValue(!otherValue)}>Change other value</button>
<div>Count: {count}</div>
</div>
);
}

export default App;

In this example, we use useCallback to memorize the increment function, which depends on count. Even if the App component re-renders (for example, when otherValue changes), the increment function will not be recreated unless count changes.

When to use useCallback

at first glance, it may seem like a good idea to just wrap any function that you write in a useCallbackhook. However, it is important to keep in mind that useCallback itself has a cost, as it involves memory allocation for storing the memorized function. Like other optimization techniques, it's best used sparingly and only when necessary. Be sure to profile your application and identify performance bottlenecks before applying useCallback or other optimization methods.

Here are some rules of thumb to guide when to use useCallback:

Passed as Props to Child Components

If you are passing a function as a prop to a child component and that child component is either expensive to render or is wrapped with React.memo(), useCallback can be beneficial to prevent unnecessary re-renders.

Used in Dependency Arrays

If the function is included in a dependency array (like in useEffect, useMemo, or another useCallback), useCallback can help prevent unnecessary effect runs or computations.

Frequent Re-renders

If the parent component where the function is defined re-renders frequently, using useCallback might help optimize performance by avoiding the re-creation of the function at every render.

Expensive Functions

If your function is computationally expensive (e.g., processing large arrays or complex calculations), useCallback might be a good choice to ensure the function isn't re-run unnecessarily.

Conclusion

to wrap up, useCallback is a valuable optimization tool in React. While it memorizes functions and minimizes unnecessary re-renders, it's not always the go-to solution due to its memory cost. So, apply useCallback wisely, typically when passing functions as props or during frequent re-renders. Understanding and using this hook effectively can lead to more efficient React applications.

--

--

Arian Garshi
Arian Garshi

Written by Arian Garshi

Software engineer & UX-designer

No responses yet