Korean_hamster
지현의 개발자 성장과정
Korean_hamster
전체 방문자
오늘
어제
  • 분류 전체보기 (122)
    • Front-End Developer (79)
      • Project (12)
      • HTML (8)
      • CSS (17)
      • Computer Science (9)
      • JavaScript (20)
      • React (13)
    • 이런저런 생각 (7)
    • 주간 성장회고 (24)
    • English (0)
    • 리뷰 (2)
    • Books (5)

블로그 메뉴

  • 방명록

공지사항

인기 글

태그

  • 멋사
  • js
  • 비전공개발자
  • CS
  • 반응형웹
  • 프론트앤드
  • HTML
  • 면접관님
  • 리액트
  • 라우터
  • 깃헙
  • fetch
  • CSS
  • AtomicHabits
  • 멋쟁이사자처럼
  • 깃
  • 프론트앤드스쿨
  • 비전공자개발자
  • flex
  • sass

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Korean_hamster
Front-End Developer/React

searched.map is not a function - 리액트에서 Hook Flow를 이해한다는것

Front-End Developer/React

searched.map is not a function - 리액트에서 Hook Flow를 이해한다는것

2022. 7. 11. 01:02

사건의 발단

데이터를 받아와 useState를 사용해서 화면에 뿌려주고 싶었다.

그리고 내가 받아올 데이터는 [배열] 이었다. (사실 이 기본을 생각하면 틀릴것도 없는 문제인데..)

function Searched() {
  const [searched, setSearched] = useState('')
  const params = useParams();

  const getSearched = async(name)=>{
    const data = await fetch(`https://api.spoonacular.com/recipes/complexSearch?apiKey=${process.env.REACT_APP_API_KEY}&query=${name}&number=9`);
    const recipes = await data.json();
    setSearched(recipes.results)
    console.log(recipes.results);
  };

  useEffect(()=>{
    getSearched(params.input)
  },[params.input])

  return (
    <Grid>
      {searched.map((recipe)=>{
        return(
          <div key={recipe.id}>
            <img src={recipe.image} alt={recipe.title} />
            <h4>{recipe.title}</h4>
          </div>
        )
      })}
    </Grid>
  )
}

export default Searched

 

결과는?

빠빠 빨간 맛.

 

searched.map이 function이 아니라고 나오면 1차적으로는 아 내가 배열이 아닌거에 map을 돌렸나? 라고 생각해야하는데 그 생각을 미처 못한 나는 계속 페이지.jsx에 컴포넌트를 잘 넣은건 맞는지, 라우터는 잘 들어갔는지를 전전하며 시간을 허비했다...

 

그리고 발견한,

  const [searched, setSearched] = useState('')

 

처음에 useState값을 '빈 배열'이 아닌 null로 넣어준 게 눈에 보였고 그 순간 아..! 했다.

빈 배열로 바꿔주니 제대로 동작하는 것을 보고 안심하긴 했지만 '아니 초기값으로 뭘 해놨던지간에 나는 배열데이터를 받아서 map을 돌려준건데 왜 문제가 되지?'라고 생각했는데, 다시 React flow를 천천히 생각해보니 이해가 되었다.

 

그래서 지금 어떻게 돌아가고있는거냐면...

화면이 처음 마운트 될 때! 즉 다시말해 맨~ 처음 이 화면이 렌더링 될 때에는 아래와 같은 순서로 진행된다. 

function Searched() {
	// 1. 초기화작업이 진행된다. useState는 ''로 셋팅된다. 
  const [searched, setSearched] = useState('')
  const params = useParams();

	// 얘는 함수선언이니까 무시 
  const getSearched = async(name)=>{
    const data = await fetch(`https://api.spoonacular.com/recipes/complexSearch?apiKey=${process.env.REACT_APP_API_KEY}&query=${name}&number=9`);
    const recipes = await data.json();
    setSearched(recipes.results)
    console.log(recipes.results);
  };

	// 이 useEffect는 렌더링이 끝난 이후에 실행된다!!!
  useEffect(()=>{
    getSearched(params.input)
  },[params.input])

	// 2. 리턴문까지 렌더링이 된다.
  return (
    <Grid>
    	// 3. 근데 지금 초기화값은 ''인데 map을 돌렸네? -> 오류!!! 
      {searched.map((recipe)=>{
        return(
          <div key={recipe.id}>
            <img src={recipe.image} alt={recipe.title} />
            <h4>{recipe.title}</h4>
          </div>
        )
      })}
    </Grid>
  )
}

export default Searched

리액트에서 useEffect는 랜더링이 다 진행된 후에 실행된다!

고로 리턴문까지 다 돌고난 그제서야 useEffect는 실행이 될 수 있는데, 그때의 useState는 아직 null이기 때문에 map을 붙여놓은게 당연히 오류를 뿜는것임! 

 

마운트시 실행순서

  1. Run lazy initializers
  2. render
  3. React updates DOM
  4. Run LayoutEffects
  5. Browser apints screen
  6. Run Effects -> 가장 마지막이다.

 

업데이트시 실행순서

  1. render -> 초기화과정이 빠졌다.
  2. React updates DOM
  3. Cleanup LayoutEffects
  4. Run LayoutEffects
  5. Browser apints screen
  6. Cleanup Effects
  7. Run Effects -> 역시나 마지막이다.

 

리액트는 플로우를 잘 이해하고 있지 않으면 불행하다^^

작은 실수에서 큰 깨달음을 얻는다. 

리액트를 사용하면서 Hook Flow를 이해하고있지 않으면 읭? 하는 상황이 올 때마다 해결방법을 도무지 찾기가 어려워지니

계속해서 원리를 새기며 코딩하자.

저작자표시 (새창열림)

'Front-End Developer > React' 카테고리의 다른 글

이젠, Nav바 만들때 NavLink를 쓰자 - active일 때 CSS스타일링하기  (0) 2022.07.24
No routes matched location "/" 오류 간단해결방법(반전의 실수..)  (0) 2022.07.10
styled-components 사용시 Invalid hook call 오류 해결하기  (2) 2022.07.03
리액트 유치원이 개원했습니다. (유투브 채널개설)  (0) 2022.06.20
useState Lazy initialization - 게으른 초기화가 대체 뭔소리야? (+유투브 영상 업로드)  (4) 2022.06.16
  • 사건의 발단
  • 그래서 지금 어떻게 돌아가고있는거냐면...
  • 리액트는 플로우를 잘 이해하고 있지 않으면 불행하다^^
Korean_hamster
Korean_hamster
Keep pushing myself to the limits

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.