rc-hooks
Version:
React Hooks Library.
60 lines (59 loc) • 1.83 kB
JavaScript
import { __read } from "tslib";
import { useState, useEffect } from 'react';
import ResizeObserver from './ResizeObserver';
import getRef from '../utils/getRef';
import useLatest from '../useLatest';
/**
* 获取并监听 dom 节点的宽高。
*
* @param {Object} ref `dom` 节点引用。
* @returns {Object} 返回 `dom` 节点的宽高。
* @example
* const ref = useRef<HTMLDivElement>(null);
* const size = useSize(ref);
*
* return (
* <>
* <h1 ref={ref}>Hello, world</h1>
* <p>rect value: {JSON.stringify(size)}</p>
* </>
* );
*/
function useSize(ref) {
var latestRef = useLatest(ref);
var refIsFunc = typeof ref === 'function';
var wrapperRef = refIsFunc ? latestRef : ref;
var _a = __read(useState(function () {
var target = getRef(ref);
return {
width: target === null || target === void 0 ? void 0 : target.clientWidth,
height: target === null || target === void 0 ? void 0 : target.clientHeight
};
}), 2), size = _a[0], setSize = _a[1];
useEffect(function () {
var target = getRef(refIsFunc ? wrapperRef.current : wrapperRef);
function refresh(el) {
if (el) {
setSize({
width: el.clientWidth,
height: el.clientHeight
});
}
}
if (!target) {
return function () { };
}
refresh(target);
var observer = new ResizeObserver(function (mutationsList) {
mutationsList.forEach(function (mutation) {
refresh(mutation.target);
});
});
observer.observe(target);
return function () {
observer.disconnect();
};
}, [wrapperRef, refIsFunc]);
return size;
}
export default useSize;