@figliolia/size-observer
Version:
Resize Observers simplified
26 lines (24 loc) • 730 B
text/typescript
import { useLayoutEffect, useRef } from "react";
import { SizeObserver } from "./SizeObserver";
import type { Options } from "./types";
export const useSizeObserver = <T extends Element = Element>(
options: Options<T>,
) => {
const node = useRef<T>(null);
const stableOptions = useRef<Options<T>>(options);
stableOptions.current = options;
const observer = useRef<SizeObserver<T> | null>(null);
if (observer.current) {
observer.current.setOptions(stableOptions.current);
}
useLayoutEffect(() => {
if (!node.current) {
return;
}
observer.current = new SizeObserver(node.current, stableOptions.current);
return () => {
observer.current?.destroy();
};
}, []);
return node;
};