mirror of
https://github.com/streamich/react-use.git
synced 2026-01-18 14:06:52 +00:00
52 lines
993 B
TypeScript
52 lines
993 B
TypeScript
/* eslint-disable */
|
|
import { useState, useEffect, useRef, RefObject } from 'react';
|
|
import ResizeObserver from 'resize-observer-polyfill';
|
|
|
|
export interface ContentRect {
|
|
width: number;
|
|
height: number;
|
|
top: number;
|
|
right: number;
|
|
left: number;
|
|
bottom: number;
|
|
}
|
|
|
|
const useMeasureDirty = (ref: RefObject<HTMLElement>): ContentRect => {
|
|
const frame = useRef(0);
|
|
const [rect, set] = useState({
|
|
width: 0,
|
|
height: 0,
|
|
top: 0,
|
|
left: 0,
|
|
bottom: 0,
|
|
right: 0,
|
|
});
|
|
|
|
const [observer] = useState(
|
|
() =>
|
|
new ResizeObserver((entries) => {
|
|
const entry = entries[0];
|
|
|
|
if (entry) {
|
|
cancelAnimationFrame(frame.current);
|
|
|
|
frame.current = requestAnimationFrame(() => {
|
|
set(entry.contentRect);
|
|
});
|
|
}
|
|
})
|
|
);
|
|
|
|
useEffect(() => {
|
|
observer.disconnect();
|
|
|
|
if (ref.current) {
|
|
observer.observe(ref.current);
|
|
}
|
|
}, [ref]);
|
|
|
|
return rect;
|
|
};
|
|
|
|
export default useMeasureDirty;
|