UNPKG

rc-hooks

Version:
60 lines (59 loc) 1.83 kB
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;