What is the useCallback hook in React.js?

In React.js, useCallback is a built-in hook that optimizes the performance of functional components by memoizingMemoization is an optimization technique that allows an increase in the performance of a program by storing the results of some expensive function so that we don’t need to call that function when the same inputs are given. callbackA callback is a function passed as an argument to another function. This technique allows a function to call another function. A callback function can run after another function has finished. functions. It allows us to prevent unnecessary re-rendering of child components when the parent component re-renders.

How does useCallback work?

When a functional component re-renders, all of its functions are re-created. If a function is passed as a prop to a child component, and the parent re-renders, the child component will also re-render, even if its own state or props haven't changed. This can be inefficient, especially when dealing with large or complex components.

useCallback() solves this problem by memoizing a function and returning the memoized version. It remembers the function reference between re-renders and only changes it if one of the dependencies listed in its dependency array changes. This way, the memoized function is only recreated when necessary.

Note: The useCallback hook is only triggered when one of its dependencies is updated.

Syntax of useCallback

The syntax of useCallback() is as follows:

const memoizedCallback = useCallback(callback, dependencies);
  • callback: The function that we want to memorize.

  • dependencies (optional): An array of dependencies that, when changed, will trigger the recreation of the memoized function. If no dependencies are provided, the memoized function will be recreated on every render.

Example of useCallback

Let's take a look at how to use the useCallback() hook:

import React from 'react';
import ReactDOM from 'react-dom';
import IncrementComponent from './app.js';

// Select the HTML element with the id "root" and assign it to the 'rootElement' constant
const rootElement = document.getElementById("root");

// Render the 'IncrementComponent' component inside the 'rootElement' in the DOM
ReactDOM.render(
  <IncrementComponent />, // Render the IncrementComponent component
  rootElement // Use the rootElement as the container for rendering
);
Counter application using useCallback hook

Code explanation

App.js

  • Line 1: In app.js, we import the necessary modules from the "React" library to use the required hooks and React features in our component.

  • Line 3-7: The IncrementComponent function is defined and exported as the default export from this module so that we can use it inside our index.js file. Inside IncrementComponent, we use the useState hook to declare a state variable count with an initial value of 0. We can update the value of count by using the setCount function.

  • Line 10-14: The useCallback hook creates a memoized version of the increment function. It increases the count state variable by 11 when it is called. The [count] dependency array makes sure that the increment function is only recreated when the count value changes.

  • Line 16-21: The component returns JSX markup that represents the UI. It displays the current value of count using interpolation ({count}), and a button element that triggers the increment function when clicked.

Index.js

  • Line 1-3: In index.js, we import the React and ReactDOM modules, which are required to render React components in the browser. The IncrementComponent component is imported from the app.js file.

  • Line 6: We select the HTML element with the id "root" using document.getElementById("root") and assign it to the rootElement constant. This is where the React component will be rendered.

  • Line 9-12: ReactDOM.render() is called to render the IncrementComponent component inside the rootElement. The component will be injected into the DOM and displayed on the webpage.

Strengths and advantages of useCallback

  • Performance optimization: By memoizing callback functions, useCallback reduces unnecessary re-renders, leading to improved performance in React applications.

  • Prevents unnecessary child re-renders: By providing a stable callback reference, child components that receive the memoized function as a prop will only re-render when their own props or state changes, avoiding unnecessary re-renders caused by parent component updates.

  • Fine-grained control: The dependency array allows us to specify which values should trigger the recreation of the memoized function. This level of control is useful in scenarios where we want to optimize specific parts of our component.

Limitations and weaknesses of useCallback

  • Overuse of useCallback: Excessive use of the useCallback hook might lead to unneeded complexity. Only those functions should be memoized that actually cause performance issues when recreated.

  • Complex dependencies: If the dependency array passed to the useCallback hook is not handled carefully, it can lead to bugs. We have to make sure to include all necessary dependencies to avoid stale closures and unexpected behavior.

Comparison with other React hooks

useCallback vs. useMemo

Both useCallback and useMemo improves the performance of functional components, but their use cases are different.

  • The useCallback method is used to memoize functions, whereas the useMemo method is used to memoize data.

  • The useCallback should be used when we want to memoize a function and prevent unnecessary re-creation.

  • The useMemo() should be used when we want to memoize a value and compute it only when its dependencies change.

useCallback vs. useState

In React, useCallback and useState fulfill different purposes.

  • useCallback is used to memoize callback functions and optimize performance.

  • useState is used to manage the state within a component and trigger re-renders when the state changes.

  • Both hooks can be used together in a component to manage both state and memoized functions.

Free Resources

Copyright ©2024 Educative, Inc. All rights reserved