useResizeObserver
Watch size of an HTML element. ResizeObserver MDN
useResizeObserver wraps the native ResizeObserver API to watch for size changes on a DOM element. It invokes a callback with the full ResizeObserverEntry array whenever the element’s dimensions change. The hook returns a stop function to disconnect the observer. You can also pass ResizeObserverOptions to control which box model (content-box, border-box, or device-pixel-content-box) is observed.
When to Use
- Executing custom logic (e.g., recalculating layouts or redrawing canvases) in response to element size changes
- Building wrapper components that need raw ResizeObserver entries for advanced measurement logic
- Observing size changes on elements that resize independently of the window (e.g., resizable panels, flex items)
Notes
- Performance: ResizeObserver is much more efficient than polling element dimensions or listening to window resize events. The callback fires only when the observed element actually changes size.
- Cleanup: The observer is automatically disconnected on unmount. Call the returned
stopfunction to disconnect manually at any time. - See also
useElementSizefor a simple[width, height]return value, anduseMeasurefor a fullDOMRectreturn value — both built on top of ResizeObserver.
Usage
Live Editor
function Demo() { const ref = useRef<HTMLTextAreaElement>(null); const [width, setWidth] = useState(0); const [height, setHeight] = useState(0); const stop = useResizeObserver(ref, (entries) => { const [entry] = entries; const { width, height } = entry.contentRect; setWidth(width); setHeight(height); }); return ( <div> <div>Resize the box to see changes</div> <div> <button onClick={() => stop()}>stop observe</button> </div> <br /> <textarea ref={ref} disabled style={{ width: 286, height: 166 }} value={`width: ${width}\nheight: ${height}`} /> </div> ); };
Result
API
useResizeObserver
Returns
() => void
Arguments
| Argument | Description | Type | DefaultValue |
|---|---|---|---|
| target | dom element | BasicTarget<Element> (Required) | - |
| callback | callback | ResizeObserverCallback (Required) | - |
| options | options passed to resizeObserver | ResizeObserverOptions | undefined | - |
BasicTarget
export type BasicTarget<T extends TargetType = Element> = (() => TargetValue<T>) | TargetValue<T> | MutableRefObject<TargetValue<T>>;
TargetValue
type TargetValue<T> = T | undefined | null;
TargetType
type TargetType = HTMLElement | Element | Window | Document | EventTarget;