문제 배경
초기 컴포넌트 로딩중에 원하지 않는 0이 출력되었습니다.
원인 파악
이미지를 불러오는 초기 과정에서 발생하기 때문에 디버거를 사용하여
원하는 시점에 코드를 멈춰두고
<button>이전</button>
{totalThumbnailsNumber && (
<button
className="absolute top-4 py-2 pl-6 z-10 bg-black/60 bg-opacity-50 cursor-pointer hover:bg-black/80 focus:bg-black/80 text-3xl text-white p-2 rounded-r hover:bg-opacity-70 control-visibility"
onClick={() => setIsExpanded(!isExpanded)}
aria-label="썸네일 보기"
aria-expanded={isExpanded}
aria-controls="thumbnails-panel"
tabIndex={0}
>
<PiImages aria-hidden="true" />
</button>
)}
<button>다음</button>
이전 다음과 같이 구간을 탐색할 수 있는 요소로
원인이 되는 코드를 특정하여 분석하였습니다.
분석 결과 빈 배열의 length 값으로 0이 들어오는데
기존의 javascript에서는 falsy값이어서 false로 처리되지만
React JSX에서는 아래와 같이 다른 동작을 하여
원치 않은 동작이 나온 것이었습니다.
React JSX에서의 0 처리 특징
JavaScript에서 0
은 일반적으로 "falsy" 값이 맞습니다. 하지만 React의 JSX에서는 조금 다르게 동작합니다.
JavaScript vs React JSX
JavaScript에서의 0
// JavaScript에서 0은 falsy입니다
if (0) {
console.log("실행되지 않음");
} else {
console.log("0은 false입니다"); // 이게 출력됨
}
// 논리 연산자에서도 falsy로 동작
console.log(0 && "something"); // 0 출력
React JSX에서의 0
// React JSX에서는 0도 렌더링 됩니다!
return (
<div>
{0} {/* "0"이 화면에 출력됨 */}
{0 && <button>버튼</button>} {/* "0"이 화면에 출력됨 */}
{false && <button>버튼</button>} {/* 아무것도 출력되지 않음 */}
{null && <button>버튼</button>} {/* 아무것도 출력되지 않음 */}
{undefined && <button>버튼</button>} {/* 아무것도 출력되지 않음 */}
</div>
);
왜 이렇게 동작하나요?
React JSX에서는 렌더링 가능한 모든 값을 화면에 표시하려고 시도합니다:
false
,null
,undefined
는 아무것도 렌더링하지 않습니다- 하지만
0
은 유효한 숫자이므로 문자열로 변환되어 렌더링됩니다
해결 방법
1. 명시적인 비교 사용
{totalThumbnailsNumber > 0 && (
<button>썸네일 보기</button>
)}
2. Boolean으로 변환
{!!totalThumbnailsNumber && (
<button>썸네일 보기</button>
)}
3. 삼항 연산자 사용
{totalThumbnailsNumber > 0 ? (
<button>썸네일 보기</button>
) : null}
위 세 개의 방법을 추천 받았습니다
그 중에 2번째 방법을 채택하여
'개발 > 기록' 카테고리의 다른 글
중고 자동차 사이트 이미지 뷰어 개선 프로젝트: zoom & swipe image Viewer 개발 (1) | 2025.03.27 |
---|---|
zoom & swipe image Viewer: tab index 문제 해결 (0) | 2025.03.27 |
zoom & swipe image Viewer: zoom, reset 에러 해결 (0) | 2025.03.25 |
zoom & swipe image Viewer: 사진 전환 시 zoom 상태 초기화 하기 (0) | 2025.03.23 |
제네릭 타입 선언시 nerver와 void의 차이 (0) | 2025.03.01 |