개발자

캐러셀에서 다중 이미지 로드시 스켈레톤을 보여주는 방법

2022년 10월 27일조회 179

캐러셀 안에서 이미지 컴포넌트를 map으로 그려주고 있습니다. 이미지 컴포넌트가 로드중일 때 스켈레톤을 보여주고 싶은데 이슈가 있습니다. 이슈: 여러 이미지 컴포넌트를 그릴 때 이미지가 하나라도 로딩중이면 스켈레톤 + 컴포넌트가 동시에 보임 컴포넌트 예시 ex) const imageRef = useRef(null); const isComplete = imageRef.current?.complete; {!isComplete && <Skeleton />} <img alt={alt} src={src} ref={imageRef} /> 위와 같은 코드를 작성했는데 ref값이 세팅되기 전에 isComplete가 undefined인 순간이 있어서 그런 것 같습니다... 그래서 코드를 다음과 같이 수정했는데 스켈레톤이 무한으로 로딩되네요.. {!isComplete ? <Skeleton /> : <img alt={alt} src={src} ref={imageRef} />} 로딩시에 스켈레톤을 보여줄 수 있는 좋은 방법이 있을까요?

이 질문이 도움이 되었나요?
'추천해요' 버튼을 누르면 좋은 질문이 더 많은 사람에게 노출될 수 있어요. '보충이 필요해요' 버튼을 누르면 질문자에게 질문 내용 보충을 요청하는 알림이 가요.
profile picture
익명님의 질문

답변 1

성원님의 프로필 사진

{!isComplete ? <Skeleton /> : <img alt={alt} src={src} ref={imageRef} />} 이 코드를 보면 이미지 태그가 조건부로 렌더링되는데, isComplete값이 항상 false라서 ref가 브라우저 돔의 img 값을 못 참조하고 있네요. 아마 undefined를 리턴하고 있을 것 같은데요 따라서 스켈레톤만 화면에 보이는 것 같습니다. 이렇게 바꿔보면 어떨까요? <Skeleton style={{ display: isComplete ? 'none' : 'block' }} /> <img alt={alt} src={src} ref={imageRef} style={{ display: !isComplete ? 'none' : 'block' }} /> display:none을 사용하면 이미지 태그가 돔 트리에 생성되기 때문에 ref가 img 값을 참조할 수 있습니다. 따라서 isComplete 값도 변경됩니다. 주의할점은 const isComplete = imageRef.current?.complete; 이런식으로 isComplete값을 참조하고 있는데, ref의 current값은 변경되어도 컴포넌트를 렌더링시키지 않습니다. 따라서 isComplete 값은 state로 관리하고 onLoad 시점과 complete 시점에 state를 변경할 수 있도록 수정하면 될 것 같습니다

profile picture

익명

작성자

2022년 10월 31일

그렇네요.. 렌더링이 되지 않아서 useRef가 값을 참조할 수 없었네요. 감사합니다!

지금 가입하면 모든 질문의 답변을 볼 수 있어요!

현직자들의 명쾌한 답변을 얻을 수 있어요.

또는

이미 회원이신가요?

목록으로
키워드로 질문 모아보기

실무, 커리어 고민이 있다면

새로운 질문 올리기

지금 가입하면 모든 질문의 답변을 볼 수 있어요!