import { debounce } from 'lodash'; import { useEffect, useRef, useState } from 'react'; /** * 用于追踪 DOM 元素尺寸的 hook。 * * @param initialWidth - 初始宽度。 * @param initialHeight - 初始高度。 * @param deps - 依赖列表。 * @return 一个元组,包含 DOM 元素的 ref、当前宽度和当前高度。 */ export function useDomSize( initialWidth: number, initialHeight: number, deps: React.DependencyList = [], ) { const domRef = useRef(null); const [width, setWidth] = useState(initialWidth); const [height, setHeight] = useState(initialHeight); useEffect(() => { const setDomHeight = () => { if (domRef.current) { setHeight(domRef.current.offsetHeight); setWidth(domRef.current.offsetWidth); } }; const debounceFunc = debounce(setDomHeight, 100); setDomHeight(); window.addEventListener('resize', debounceFunc); return () => { window.removeEventListener('resize', debounceFunc); }; // eslint-disable-next-line react-hooks/exhaustive-deps }, deps); return [domRef, { width, height }] as const; }