개발자

react-query로 이미지를 가져올 때, 이미지가 깜빡거리는 문제를 해결하고 싶어요.

2024년 05월 14일조회 336

React 프로젝트에서 차량 데이터 목록(차량 모델 사진, 차량명, ....등)을 보여주는 웹 프로젝트를 진행하고 있습니다. 차량 데이터 목록 화면에서 react-query를 통해 가져온 데이터는 (예시 데이터) const data = [{id: number, car_name: string, model_name, car_model_image: number...}, {.....} ] 이런식으로 가져와서 map을 통해 CarCard 컴포넌트에 데이터를 props로 보내어 현재 출력하고 있습니다. 여기서 이미지 같은 경우는 백엔드에서 차량 모델 이미지를 가져오는 api를 따로 만들어놓아서, props로 전달받은 car_model_image 즉, 차량 모델 이미지의 id를 통해서 차량 모델 이미지 api에 데이터를 요청해서 이미지를 출력하고 있습니다. 이때. 페이지를 전환하거나, 한 페이지에서 아무동작을 하지 않아도 게속 이미지가 깜빡거리면서 재렌더링이 되고, 계속 무한정으로 이미지를 호출하는 문제가 발생하였습니다. map을 통해 CarCard를 호출하고 CarCard 안에서 이미지를 호출함에 따라서 계속 이미지가 깜빡깜빡 거리는 것 같은데, 컴포넌트 안에서 이미지를 호출할 때 어떻게 하면 무한정으로 이미지를 불러오지 않도록 하고 깜빡거림을 없앨 수 있을까요 ?...어떻게 해결해야 할지 감이 안 잡혀요.... //차량 목록 페이지 한 부분 ... const { data } = useGetCarList(); //useQuery를 통해 서버에서 데이터 전달받음 // const data = [{id: number, car_name: string, model_name, car_model_image: number...}, {.....} ] 이런식 .... return ( <div> data.map((data: CarData) => { return ( <Carcard ascCarData={data} key={Math.random()} handleClick={() => handleClick(data)} isActive={true} /> ); }) </div> ) //Carcard 컴포넌트 const { data: carImage } = useGetCarModeImage(ascCarData.car_model_image); // 이미지 데이터 가져오기

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

답변 4

허니님의 프로필 사진

일단 key={Math.random()} 부터 고치시는 게 좋습니다. 올바른 렌더링 최적화를 위해서는 고유한 data.id와 같은 값을 사용해야 합니다. 다른 부분은 더 봐야 알 것 같습니다

정 훈님의 프로필 사진

어떤 문제인지 정확하게 모르겠으나, 1. useQuery의 refetchOnWindowFocus, refetchOnMount 옵션을 false로 바꿔보세요. 2. 스켈레톤 UI를 활용하여 레이아웃 시프트를 방지할 수 있습니다.

짹님의 프로필 사진

Component가 re-rendering 되는 이유를 찾아보세요.

백승훈님의 프로필 사진

구조가 전혀 예상이 안가는데.. 위에서 받고 자식한테 이미지를 내려주는건가요?? useGetCarModeImage 이게 뭔지부터가 일단 좀 의심스럽내요 정 도움이 필요하시면 연관된 전체 코드를 올려주셔야 한번 검토라도 가능합니다.

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

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

또는

이미 회원이신가요?

AI 답변
커리어리 AI 봇 프로필 이미지

커리어리 AI 봇

GPT가 달아주는 답변입니다.

2024년 05월 14일

React Query의 기본적인 동작 중 하나는 데이터가 추가적으로 변경될 수 있는 경우 이를 반영하기 위해 자동으로 재요청을 보내는 것입니다. 그러나 이미지 로딩에 있어서 이러한 재요청은 원치 않는 깜박임 현상을 일으킬 수 있습니다. 주어진 코드에서는 `Carcard` 컴포넌트 내부에서 `useGetDroneModeImage`를 사용하여 이미지를 불러오고 있습니다. 매번 컴포넌트가 리렌더링 될 때마다 새로이 API 호출이 발생하는 문제점이 있을 수 있습니다. 또 다른 문제는 key에 사용되는 `Math.random()`함수입니다. React에서 리스트 항목을 렌더링할 때 고유하게 식별할 수 있는 key 속성을 제공하지 않으면, React는 배열 인덱스를 대신 사용합니다. 그러나 배열의 순서가 바뀔 때 마다 키가 변경되기 때문에 재렌더링이 발생하며, 이 경우 이미지의 깜박임 현상이 발생할 수 있습니다. 다음 방법 중 하나를 사용하여 해결해 보실 수 있습니다: 1. 드론 모드 이미지를 별도의 API 호출로 가져오는 대신, 차량 목록 API 응답에 포함시켜 한 번의 호출로 모든 필요한 데이터를 가져오는 방법입니다. 이 경우 이미지를 로드하는 데 필요한 별도의 API 요청이 없으므로 깜박임이 사라질 것입니다. 2. `useGetDroneModeImage` 훅에서 `staleTime` 옵션을 사용하여 데이터가 언제 '오래된'것으로 간주될지 설정합니다. 이는 React Query가 자동적으로 데이터를 재요청하는 시점을 지연시키므로 이 값이 충분히 크면 깜박임 현상을 줄일 수 있습니다. 3. 또 다른 접근법은 첫 번째 요청에서 가져온 이미지를 웹 브라우저에 캐싱하고, 이미지 URL이 변경되었을 때만 재요청을 발생시키는 것입니다. 이렇게 하면 페이지 내의 동일한 URL에 대한 중복 요청으로 인한 깜박임 현상을 완화할 수 있습니다. 4. key값으로 `Math.random()`대신 고유한 id값인 `ascCarData.id`사용해 보세요. 재렌더링이 계속 발생하는 원인과 해결 방법을 찾아보기 위해 위의 방법들중 하나 혹은 여러개를 시도해보시기 바랍니다.

목록으로

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