리액트를 다루는 사람이라면 정말 환장하는 메세지일 것이다.
라이프사이클을 잘 알고 있어도 한번쯤은 에러를 보게 될 것이다.
정말 이 메세지와 작별을 하고 싶어서 다양한 방식으로 연구를 해보았다.
아직 100% 작별은 못했다.... 항상 뜬다. 그래도 이젠 뜨고나서 해결은 되더라.
아직 라이프사이클이 익숙하지 않다면 이것부터 읽고 오자.
: 다시 한번 빨간 메세지를 보며 공부하고 싶어지는 의욕을 불태워보자.
재렌더
가 일어나는지 알고 있을 것이다.props로 넘겨 주거나
, map
과 같은 함수를 사용할때 주로 위와 같은 에러가 발생한다. : 생략하고 아래에서 해결 방법을 확인해 보자.
: 항상 이게 제일 먼저이다. 리덕스나 컨테이너로 상태 관리를 하고 있다면 상관없겠지만...
부모 자식의 관계가 존재하는 경우라면 무조건 찾아야 한다.
부모에서 렌더 되지 않은 비어 있는 값을 넘겨주고 있다면 자식에서 어떤 방법을 써도 소용이 없었다.
(이걸로 시간 정말 많이 허비했다...)
내가 받고 있는 값이 부모에게서 전달받고 있다면 가장 최상위 부모로 가서 제대로 값을 넘겨주고 있는지 살펴보자.
: 배열만큼은 아래서 설명할 방법과 조금 차이가 있다.
가장 마지막에 설명할 예정이니 배열이라면 4번으로 바로 넘어가자.
: 최상위 부모를 찾았고, 배열이 아니라면 아래 방법을 이용하자.
사실 방법은 이론적으로는 쉽다. 값이 제대로 넘어는 렌더 단계까지의 모든 라이프 사이클을 전부 패스 시켜 버리는 것이다. 넘기는 방법에 대해 아래 연구한 방법을 한번 보자.
: 조건문을 활용하여 정상적인 값이 넘어올때까지 모든 렌더를 다 패스해!!
라고 명령한다면 해결 된다.
{ this.state.stateValue ? this.state.stateValue : null }
: 논리 연산자를 활용해서 조건을 부여하면 조금 더 쉽게 써볼 수 있었다.
{this.state.product && this.state.product.map(ele => ele)}
: 배열이라면 위의 방법으로도 해결이 되지 않을 것이다.
{this.state.products.length > 0 && this.state.products.map(ele => ele)}
{this.state.products.length && this.state.products.map(ele => ele)}
0
은 그 자체로도 falsy한 값이다.다들 모든 에러가 해결되길 바라며.... 이 방법으로도 안될때 다시 Lab을 올리도록 하겠다.