一些动画需要侦听div高度。最开始,我使用的是react-resize-aware框架,它通过将内嵌iframe,侦听onResize捕获事件。然而,这种方法有性能问题。后来,改用Resize Observer手写了一个侦听高度的hook。
源码
使用TypeScript和React hook:
function useResizeObserver(): [
ref: React.Dispatch<React.SetStateAction<HTMLElement | null>>,
sizes: { height?: number; width?: number }
] {
const [ref, setRef] = useState<HTMLElement | null>(null);
const [sizes, setSizes] = useState<{ height?: number; width?: number }>({});
useEffect(() => {
if (!ref) return;
const observer = new ResizeObserver(() => {
setSizes({ height: ref.offsetHeight, width: ref.offsetWidth });
});
observer.observe(ref);
return () => {
observer.disconnect();
setSizes({});
};
}, [ref]);
return [setRef, sizes];
}
如果不使用React,只要关注ResizeObserver相关的代码,传入dom,就可以使用。
使用
我最简化了使用方式,从而契合React声明式思想,只需要向侦听元素传入一个ref即可测量。
注意,此处不是通过useRef获得dom。
function Example() {
const [ref, sizes] = useResizeObserver();
console.log(sizes.height, sizes.width);
return <div ref={ref}></div>;
}
欢迎来到Yari的网站:yar2001 » React使用Resize Observer侦听div高度变化