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
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 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/