DEV Community

Cover image for Introducing `useThrottledCallback`: Enhance Performance with Throttled Callbacks in React
Yarden Porat
Yarden Porat

Posted on

Introducing `useThrottledCallback`: Enhance Performance with Throttled Callbacks in React

In the world of web development, creating smooth and performant user experiences is paramount.

One common challenge developers face is dealing with event handlers that can fire rapidly, potentially causing unnecessary re-renders and performance bottlenecks.

This is where throttling comes into play. Throttling limits the rate at which a function is executed, ensuring that it's called at a controlled pace, thus optimizing performance.

That is why I created a new React hook that simplifies the implementation of throttled callbacks - useThrottledCallback.

This hook streamlines the process of creating throttled callbacks and also aligns perfectly with best practices in React development, including seamless integration with React linting tools.

useThrottledCallback

Let's take a closer look at how the useThrottledCallback hook works:

TypeScript

import { useMemo, type DependencyList } from 'react';
import throttle from 'lodash.throttle';

export const useThrottledCallback = <TCallback>(
    fn: TCallback,
    dependencies?: DependencyList,
    wait: number = 250
) => {
    // eslint-disable-next-line react-hooks/exhaustive-deps
    return useMemo(() => throttle(fn, wait), [wait, ...(dependencies ?? [])]);
};

Enter fullscreen mode Exit fullscreen mode

JavaScript

import { useMemo } from 'react';
import throttle from 'lodash.throttle';

export const useThrottledCallback = (
    fn,
    dependencies,
    wait = 250
) => {
    // eslint-disable-next-line react-hooks/exhaustive-deps
    return useMemo(() => throttle(fn, wait), [wait, ...(dependencies ?? [])]);
Enter fullscreen mode Exit fullscreen mode

The hook accepts three parameters:

  1. fn: The callback function you want to throttle.
  2. dependencies (optional): An array of dependencies that, when changed, trigger the creation of a new throttled callback. This aligns with React's dependency tracking system.
  3. wait: The time interval in milliseconds that specifies how often the throttled function can be executed.

Enhancing Code Quality with Linting

Linting helps Maintaining clean and organized code is essential for collaboration and long-term project health.

useThrottledCallback dependency array can be validated by linting, specifically the by popular react-hooks/exhaustive-deps rule.

In your linting configuration file (usually .eslintrc), add the following configuration to the rules section:

   "rules": {
     "react-hooks/exhaustive-deps": [
       "warn",
       {
         "additionalHooks": "(useThrottledCallback)"
       }
     ],
     // ... other rules
   }
Enter fullscreen mode Exit fullscreen mode

With this setup, linting tools will recognize your usage of the useThrottledCallback hook and ensure that you provide appropriate dependencies to the hook to avoid unnecessary re-renders.

Conclusion

The useThrottledCallback hook brings simplicity and performance optimization to your React applications. By incorporating throttled callbacks, you can effortlessly manage event handlers that could otherwise cause performance hiccups. With linting integration, maintaining code quality becomes a breeze, ensuring your projects stay organized and efficient.

Give the useThrottledCallback hook a try in your next React project, and experience the benefits of smooth user interactions and enhanced code maintainability. Happy coding!

Top comments (0)