본문 바로가기
오류 해결

[React.js] fetch로 받은 데이터 map() 에러

by Chaedie 2022. 8. 19.
728x90

동적 라우팅 강의를 보다가

동적 라우팅 강의를 보며 코드를 따라 치다 문제가 되는 부분이 생겼습니다.

fetch를 사용해서 users 데이터를 데려온 뒤, map으로 뿌려주는 형태였는데, users 패치가 완성 되기 전 map으로 뿌리는 렌더링을 먼저 실행해서, undefined에 map() 메서드를 실행하려 하니 에러가 뜨고 더 이상 리렌더링도 진행되지 않았습니다.

import { useEffect, useState } from 'react';
import { Link } from 'react-router-dom';

function List() {
  const [users, setUsers] = useState();

  try {
    useEffect(() => {
      fetch('https://reqres.in/api/users/')
        .then(res => res.json())
        .then(result => {
          console.log(result);
          setUsers(result.data);
        });
    }, []);
  } catch (error) {
    console.warn('패치 에러 ');
  }

  return (
    <section className="list">
      <h1>List 페이지!!!</h1>
      <nav>
         {/* {users.map(({ id, first_name, email, avatar }) => ( */}
        {users &&
          users.map(({ id, first_name, email, avatar }) => (
            <Link key={id} to={`/post/${id}`}>
              <p>
                <strong>{first_name}</strong>
              </p>
              <p>{email}</p>
              <img alt="avatar" src={avatar} />
            </Link>
          ))}
      </nav>
    </section>
  );
}
export default List;

해결법

해결 방법은 users && 라는 코드를 map쓰는 부분 앞에 추가해주어, users 가 존재할 때만 map()함수를 돌리도록 변경하니 해결이 되었습니다.

처음 생각했던 것은 fetch가 끝나고 나면 setState가 실행되니 리렌더링이 될것으로 생각했습니다.
하지만 undefinded에 map함수를 사용해버리니 리렌더링도 안되는 먹통상태가 되어 문제가 생겼었던거였습니다.
그걸 users && 라는 처리를 통해 users 데이터가 있을 때만 map함수가 실행되도록 변경해 해결했습니다.

끝~!

'오류 해결' 카테고리의 다른 글

[Node.JS] async-await 관련 삽질 해결  (0) 2022.07.12
JAVA IF문 안으로 안 들어가는 현상  (0) 2022.04.28

댓글