[Project] 1차 프로젝트 5일차

Simple Key·2020년 5월 3일
0
post-custom-banner

5일차

메뉴 상세페이지 레이아웃을 만들고나서 목업 데이터를 {this.state.name}식으로 페이지에 불러오려고 했는데 undefined 가 뜨는 상황

    componentDidMount() {
        fetch("http://10.58.0.25:8000/menu/detail?product=Machiato")
            .then( data => data.json())
            .then( data => this.setState({coffee: data}))
    }   

이렇게 componentDidMount() 안에서 fetch()로 백엔드의 서버에 연결했더니 render에서 계속 undifined !! 먼저 render가 완료된 후에 실행되는 componentDidMount에서 fetch()setState()가 아루어지기 때문에 에러가 나는 것이었다. 이걸 막기위해 render와 return 사이에 if (!coffee) return (<></>);를 설정해주었다. 처음 render될 때 coffee의 값에 아무것도 없기 때문에 이런식으로 순간적으로 넘어갈 수 있도록 장치를 해주었다. 이게 최선인지는 모르겠지만.. 😓

    render() {
        const { coffee } = this.state;
        console.log(coffee)
        if (!coffee) return (<></>);

        return(
            <div className="menuDetailBG">
                <div className="menuDetail">
                    <div className="menuTitle">
                        <dl>
                            <dt>
                                <span>{coffee.menu.name_eng}</span>
                                {coffee.menu.name_kor} // 메뉴 한글 명 띄우기
                            </dt>
                            <dd>
                                {coffee.menu.description} // 메뉴 소개 띄우기
                         //--------생략----------

메뉴에 따라서 표시되는 데이터에도 차이가 있었는데 처음엔 어떻게 해야되는지 잘 감이 안왔지만 차근차근 해보니 역시나 다 방법이 있다..👍

방법은 className에 삼항연산자를 써서 해당 데이터 값이 있을때와 없을때 className을 바꿔주는 방법을 사용했다.

<li className={coffee.info.allergy ? "" : "invisibleList"}></li>

allergy 데이터가 들어 있으면 그대로 보여주고 없으면 false이기 때문에 className이 invisibleList로 바뀌게 된다.

.invisibleList{
  display : none;
}

SCSS로 display:none; 스타일을 줘서 감추는 방식으로 가렸다.

그런데 이런식으로 오른쪽의 영양정보 부분까지 수정하니 음료가 아닌 프로덕트 상세페이지에서 에러가 나면서 화면을 렌더할 수 없는 상황이 왔음..

display:none은 그냥 보이지만 않게 할 뿐 element는 그대로 존재하기 때문에 자꾸 이 부분에서 오류가 났다. 이럴때 && 조건부 redering을 사용해서 조건에 충족될 때만 render 할 수 있게 했다.

 <span className='sizeML'>
    제공량({coffee.nutrients[0] && coffee.nutrients[0].serve_type})
    <span>{coffee.nutrients[0] && coffee.nutrients[0].serve}</span>
 </span>

coffee.nutrients[0]의 데이터가 true일 때 즉 데이터가 있을때만 coffee.nutrients[0].serve_type의 데이터를 render하겠다는 의미다.
이렇게 하면 프로덕트 상세페이지에서는 영양정보가 없기 때문에 해당 컨텐츠를 불러오지 않고 에러도 나지 않는다.

profile
프론트엔드 개발자 심기현 입니다.
post-custom-banner

0개의 댓글