import { useEffect, useState } from"react"; import ResizeObserver from"resize-observer-polyfill"; // IE를 지원하기 위한 폴리필
const useResizeObserver = (ref) => { const [dimensions, setDimensions] = useState(null); // 현재 대상되는 요소의 정보를 state로 관리한다. // 사용하는 컴포넌트에서 이 state가 바뀔 경우 리렌더링 하기 위함이다. useEffect(() => { // useEffect는 DOM 요소가 렌더링 되자마자 실행된다. const observeTarget = ref.current; // 관찰할 대상을 지정한다. const resizeObserver = new ResizeObserver((entries) => { entries.forEach((entry) => { setDimensions(entry.contentRect); // 변화가 생겼을 경우 내부의 콜백이 실행된다. // 이 콜백에서 state를 변화시키며 해당 컴포넌트를 리렌더링 한다. }); }); resizeObserver.observe(observeTarget); // 관찰을 시작한다. return() => { // 컴포넌트가 언마운트 될 경우 관찰을 종료한다. resizeObserver.unobserve(observeTarget); }; }, [ref]); return dimensions; };