개발자

react에서 axios, map 함수를 통한 api 호출

2023년 01월 04일조회 1,348

api를 axios를 통해 불러와서 map 함수로 뿌려주려고 합니다. 다음과 같은 api 형태이구요(이미지 url은 익명글이기 때문에 가짜로 넣었습니다) { isSuccess: true, code: 1000, message: "요청에 성공하였습니다.", result: [ { bannerIdx: 1, bannerImgUrl: "https://abcde.png", bannerTitle: "프리온보딩", bannerContent: "실무에서 사용할 수 있나요?" }, ] } 이 api를 다음과 같은 함수형 컴포넌트로 호출하는데 불러와지지가 않습니다. 아래 url은 제가 제 정보보호를 위해 가짜로 넣어놓았구요. console에는 정상적으로 api 내용이 출력되고는 있습니다. 그런데 화면에 표시가 안됩니다. 왜 안될까요? function TopBanner() { const [bannerData, setBannerData] = useState([]); useEffect(() => { getBannerData(); }); const getBannerData = async () => { const result = await axios({ method: "GET", url: "https://abcde/abc/abc", }).then((response) => { console.log(response.data); setBannerData(response.data.result); }); setBannerData(result); }; return ( <Base> <Container> <StyledSlider {...settings}> {bannerData && bannerData.map((banner) => ( <div className="slick-slide"> <div key={banner.data.result.bannerIdx} imgUrls={banner.data.result.bannerImgUrl} alt={banner.data.result.bannerTitle} className="banner-image" /> </div> ))} </StyledSlider> </Container> </Base> ); } export default TopBanner;

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

답변 2

성원님의 프로필 사진

안녕하세요:) div 태그를 image 태그로 바꾼 뒤 src값에 banner.data.result.bannerImgUrl을 넣어주면 출력이 잘 될까요? div 태그를 사용해서 이미지를 보여주려면 css의 background-image 프로퍼티를 사용해야하는 것으로 알고있습니다. https://www.freecodecamp.org/news/how-to-add-an-image-url-to-your-div/

커리어리 AI 봇님의 프로필 사진

안녕하세요! 현재 코드에서 문제가 발생하는 이유는 useEffect에서 무한 루프가 발생하기 때문입니다. useEffect의 두번째 매개변수로 의존성 배열(dependency array)을 입력하지 않았기 때문입니다. 이 경우, useEffect는 컴포넌트가 렌더링될 때마다 실행되며, getBannerData 함수가 호출됩니다. 그리고 setBannerData 함수가 호출되어 상태가 변경되고, 다시 컴포넌트가 렌더링되며 무한 루프가 발생합니다. useEffect에 빈 배열을 입력하면, 컴포넌트가 처음 렌더링될 때 getBannerData 함수가 호출되고, 그 이후로는 실행되지 않습니다. 이렇게 코드를 수정하면 됩니다. 또한, setBannerData(result); 코드는 필요하지 않습니다. response.data.result를 바로 setBannerData 함수로 전달하여 상태를 업데이트하면 됩니다. 마지막으로, imgUrls 대신 src를 사용하여 이미지를 불러오는 것이 맞습니다. 다음은 수정된 코드입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
function TopBanner() {
  const [bannerData, setBannerData] = useState([]);

  useEffect(() => {
    getBannerData();
  }, []);

  const getBannerData = async () => {
    const response = await axios({
      method: "GET",
      url: "https://abcde/abc/abc",
    });
    setBannerData(response.data.result);
  };
  return (
    <Base>
      <Container>
        <StyledSlider {...settings}>
          {bannerData &&
            bannerData.map((banner) => (
              <div className="slick-slide" key={banner.bannerIdx}>
                <img
                  src={banner.bannerImgUrl}
                  alt={banner.bannerTitle}
                  className="banner-image"
                />
              </div>
            ))}
        </StyledSlider>
      </Container>
    </Base>
  );
}

export default TopBanner;

커리어리 AI 봇의 답변을 평가해 주세요!

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

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

또는

이미 회원이신가요?

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

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

새로운 질문 올리기

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