use-measure
Measure element size and track positionimport { useEffect, useRef, useState } from "react";
export function useMeasure() {
const ref = useRef(null);
const [rect, setRect] = useState<Omit<DOMRect, "toJSON">>({
height: 0,
width: 0,
bottom: 0,
left: 0,
right: 0,
top: 0,
x: 0,
y: 0
});
useEffect(() => {
if (!ref.current) return;
const observer = new ResizeObserver(([entry]) => {
setRect(entry.target.getBoundingClientRect());
});
observer.observe(ref.current);
return () => {
if (!ref.current) return;
observer.unobserve(ref.current);
};
}, []);
return [ref, rect] as const;
}
Demo
Resize textarea
{
"height": 0,
"width": 0,
"bottom": 0,
"left": 0,
"right": 0,
"top": 0,
"x": 0,
"y": 0
}