Custom React Hook: useResizeObserver

RMAG news

In this post, I’ll share a custom React hook called useResizeObserver. This hook helps you observe and get the bounding client rect of a DOM element, updating the rect whenever the element is resized. It’s part of my React library, react-helper-hooks, which contains many useful hooks to save developers time.

Source Code

import { useEffect, useRef, useState } from react;

type ObserverRect = Omit<DOMRectReadOnly, toJSON>;

export default function useResizeObserver(): Array<any> {
const ref = useRef<any>(null);
const [rect, setRect] = useState<ObserverRect>();

useEffect(() => {
const observer = new ResizeObserver(() => {
if (ref.current) {
const boundingRect = ref.current.getBoundingClientRect();
setRect(boundingRect);
}
});
observer.observe(ref.current);

return () => observer.disconnect();
}, [ref]);

return [ref, rect];
}

How It Works

The useResizeObserver hook leverages the ResizeObserver API to track size changes of a DOM element. It returns a ref to be attached to the target element and the current bounding client rect of that element.

Example Usage

Here’s an example of how to use the useResizeObserver hook in a functional component:

import React from react;
import useResizeObserver from ./useResizeObserver;

function ExampleComponent() {
const [ref, rect] = useResizeObserver();

return (
<>
<textarea ref={ref} style={{ resize: both, height: 100, width: 300 }}>
Resize this element to see the changes:
</textarea>

{rect && (
<div>
<p>Top: {rect.top}</p>
<p>Left: {rect.left}</p>
<p>Width: {rect.width}</p>
<p>Height: {rect.height}</p>
</div>
)}
</>
);
}

export default ExampleComponent;

In this example, a textarea element is made resizable. The useResizeObserver hook tracks its dimensions, which are displayed outside the textarea.

About react-helper-hooks

The useResizeObserver hook is part of my React library, react-helper-hooks. This library includes a collection of custom hooks designed to save developers time and effort. Hooks like useResizeObserver provide reusable, efficient solutions for common tasks in React applications.

Feel free to check out the library and contribute or suggest new hooks!

Let me know if you need any changes or additional information!

Follow me on X ( Twitter ) – https://twitter.com/punitsonime
Let’s connect on linked in – https://www.linkedin.com/in/punitsonime/

Please follow and like us:
Pin Share