728x90
1. 문제 상황 및 원인 분석
이미지 기반 주석 입력창의 위치를 잡기 위해 paperRef의 clientWidth/Height를 참조했으나, 렌더링 시점 차이 및 DOM 변경에 따른 미세한 오차로 인해 입력창이 중앙에서 어긋나는 문제가 발생했다.
2. 시행착오 및 중간 시도들
- style 안에서 직접 clientWidth 계산식 사용
- 초기 useEffect 내에서 수동 측정
- 결과적으로 ResizeObserver 도입
3. 이전 코드
style={{
width: paperRef?.current?.clientWidth
? paperRef.current.clientWidth + 8 + 'px'
: undefined,
height: paperRef?.current?.clientHeight
? paperRef.current.clientHeight + 8 + 'px'
: undefined,
}}
4. 개선 후 코드
const [size, setSize] = useState({ width: 0, height: 0 });
useEffect(() => {
const el = paperRef.current;
if (!el) return;
const resizeObserver = new ResizeObserver(() => {
setSize({
width: el.clientWidth + 8,
height: el.clientHeight + 8,
});
});
resizeObserver.observe(el);
return () => resizeObserver.disconnect();
}, []);
...
style={{
width: `${size.width}px`,
height: `${size.height}px`,
}}
5. 정리 및 교훈
- DOM 크기는 언제든 변할 수 있으므로 실시간 추적이 필요
- ResizeObserver는 이미지, PDF, canvas 등 변동 요소에 적합
- 복잡한 계산은 style 안에서 하지 말고 변수나 상태로 분리
728x90
'React > React 실습' 카테고리의 다른 글
[React] 이벤트 기반 아키텍처 vs HTTP 서비스 아키텍처 (0) | 2025.04.18 |
---|---|
System.Text.Json을 활용한 네이버 로그인 응답 처리 개선 (1) | 2025.04.10 |
[SSO] 네이버 소셜 로그인 연동 및 보안 고려사항, (팝업 기반 소셜 로그인 처리 방식) (0) | 2025.04.10 |
[OAuth2] 기존 시스템에 네이버 소셜 로그인 기능 연동하기 (JWT + 팝업 방식) (0) | 2025.04.02 |
[React] Material-UI Popover 위치 보정과 애니메이션 적용 시행착오 기록 (0) | 2025.03.14 |
댓글