1. ref.current.clientWidth 값을 useEffect로 subscribe한 뒤 해당 값이 바뀔때 마다 재렌더링 될꺼라고 추측.
- 가장 처음 생각한 방법이지만, 아무리 window size를 줄여도 리액트 컴포넌트가 재렌더링될 명분이 없으므로 실패
2. window 전역객체에 resize 이벤트를 등록해 이벤트가 발생할 때 마다 element에 width 값과 여백 값을 찾아준다.
- 브라우저가 resize 될 때마다 정상적으로 width 값을 찾아 주었던 것처럼 보였지만, 반응형 웹으로 구현했다는 사실을 망각했다. 특정 media screen 값이 변경될때 font-size를 변경하도록 설정해놨기 때문에 특정 width에 도착해도 resize 이벤트가 등록된 시점에 rem값을 따라가 정상 작동이 되지 않는걸로 추정 된다.
import { useEffect, useRef, useState } from "react";
type elementType = {
current: HTMLDivElement | null;
};
const useElementObserver = (elRef: elementType) => {
const [size, setSize] = useState(0);
const observer = useRef(
new ResizeObserver((entries) => {
const { width } = entries[0].contentRect;
setSize(width);
})
);
useEffect(() => {
if (elRef.current) observer.current.observe(elRef.current);
return () => {
if (elRef.current) observer.current.unobserve(elRef.current);
};
}, [elRef, observer]);
return size;
};
export default useElementObserver;
function ChartContainer() {
const chartRef = useRef<HTMLDivElement>(null);
const observerElWidth = useElementObserver(chartRef);
return (
<LineChart width={observerElWidth} />
)
}