이런 경우 어떤 순서대로 진행이 될까?
1.부모 constructor
2.부모 render (부모 render 안에 있는 자식 컴포넌트로 넘어감)
3.자식 constructor
4.자식 render
5.자식 componentDidMount (여기까지 하고 부모 컴포넌트로 다시 넘어감)
6.부모 componentDidMount
7.부모 fetch 완료 (setState 발생 > 업데이트 발생 > 다시 render)
8.부모 render (부모 render 안에 있는 자식 컴포넌트로 넘어감)
9.자식 render
10.자식 componentDidUpdate
(componentDidMount는 최초 렌더 시 한 번만 실행되기 때문에 componentDidUpdate 발생. 여기까지 하고 다시 부모로 넘어감.)
11.부모 componentDidUpdate
(componentDidMount는 최초 렌더 시 한 번만 실행되기 때문에 componentDidUpdate 발생)
자식 내부에서 조건부 랜더링을 활용
&&연산자(엔드 연산자) - 논리연산자.
특정 조건을 만족할 때 내용을 보여주고, 만족하지 않을 때 아무것도 랜더링 하지 않아야 하는 상황에서는 조건부 연산자를 통해 구현할 수 있다.
빨간색 표시된 부분이 "this.state.data[0]
이 true 인 경우에만 this.state.data[0].name
을 렌더하겠다" 라는 뜻
위처럼 조건을 걸어서 내가 원하는 데이터가 있는 경우에만 랜더링을 시켜주는 방법으로 에러를 해결할 수 있다.
0
은 false
이다.“”
도 false
이다.{this.state.data.message &&
this.state.data.message.map((msg, idx) => {
return <li key={idx}> {msg}</li>;
})}
값이 있을 때 맵함수를 돌려줘야 하는데
랜더에 필요한 데이터를 받기도 전에 맵 함수를 돌리려하니, 오류가 발생하는 것.
모달창? 원래 페이지 위에 창이 하나 더 뜨는 것. 경로가 이동되는 것이 아님.
this.state= {
isMondalView: false
}
handleModal = () => {
//console.log("클릭");
}
<button className="addToCart"
onclick={this.handleModal}>구매하기</button>
//클릭이 먹히는 것을 확인.
this.state= {
this.setState({isModalView: !this.state.isModalView})
}
handleModalon = () => {
this.setState({isModalView: true})
}
handleModalOff = () => {
this.setState({isModalView: false})
}
//-> 중복되는 두 함수를 하나의 함수로 합해준 것.
return (
<>
{this.state.isModalView &&
<Modal handleModal={this.handleModal} />}
//그리고 자식 컴퍼넌트에 props 넘겨주기
<button onClick={this.props.handleModal}>close</button>