5-2. App 컴포넌트 정리하기

앞으로 App 컴포넌트 안에 있던 대부분의 코드를 지우고 각각 다른 파일에 재작성을 할건데요, 그 전에, 필요없는 코드들을 정리하도록 하겠습니다.

src/App.js

import React, { Component } from 'react';
import Header from './components/Header';
import Container from './components/Container';

class App extends Component {
    render() {
        // 레퍼런스 준비
        const { view } = this.props;

        return (
            <div>
                <Header/>
                {/* ViewSelectorContainer */}

                {/* view 값에 따라 다른 컨테이너를 보여준다 */}
                <Container visible={view==='favorite'}>
                    {/* FavoriteListContainer */}
                </Container>
                <Container visible={view==='list'}>
                    {/* InputContainer */}
                    {/* ContactListContainer */}
                </Container>

                {/* ContactModalContainer */}
                {/* FloatingButtonContainer */}
            </div>
        );
    }
}



export default App;

대부분의 코드를 날리고, 일부 컴포넌트는 컨테이너 컴포넌트로 만들것이여서 주석으로 처리했습니다.

generateRandomColor 함수는 나중 다시 필요해지니 따로 복사해두세요.

앞으로 만들 컨테이너 목록을 한번 살펴보겠습니다:

  • ViewSelectorContainer
  • FavoriteListContainer
  • InputContainer
  • ContactListContainer
  • ContactModalContainer
  • FloatingButtonContainer

우리는 대부분의 컴포넌트를 컨테이너로 만들겁니다.

그리고, App 컴포넌트도 리덕스에 연결해주어 view 값을 전달 시키겠습니다.

실무에서는, 어떤것들을 컨테이너로 만들지 정하는것은 여러분들의 자유입니다.

방식은 크게 두가지로 나뉘어지는데, 지금 하는 것 처럼 주요 기능을 맡은 컴포넌트들을 컨테이너로 따로 만들어주는것과, 페이지 단위 (지금의 경우에는 App) 로 컨테이너로 만들어주는 것 입니다.

둘 다 장단점이 있는데, 컨테이너 컴포넌트를 여러개로 만들 때의 장점은 이를 분리하는 시간이 들어간다는점이고, 장점은 유지보수를 할 때 모두 기능별로 모듈화가 되어있기 때문에 관리하기 쉬워진다는 점 입니다.

페이지단위로 범위를 크게 잡아서 컨테이너로 만들 경우에는, 장점으로는 개발시간이 단축되지만, 단점으로는 일일히 props 로 전달을 해야하고, 코드가 길어집니다.

하지만, 정해진 규칙같은건 없으니, 여러가지를 시도해보시고 자신에게 맞는 방식을 찾는것이 중요합니다.

App 컴포넌트 리덕스에 연결하기

src/App.js

import React, { Component } from 'react';
import Header from './components/Header';
import Container from './components/Container';
import { connect } from 'react-redux'

class App extends Component {
    render() {
        // 레퍼런스 준비
        const { view } = this.props;

        return (
            <div>
                <Header/>
                {/* ViewSelectorContainer */}

                {/* view 값에 따라 다른 컨테이너를 보여준다 */}
                <Container visible={view==='favorite'}>
                    {/* FavoriteListContainer */}
                </Container>
                <Container visible={view==='list'}>
                    {/* InputContainer */}
                    {/* ContactListContainer */}
                </Container>

                {/* ContactModalContainer */}
                {/* FloatingButtonContainer */}
            </div>
        );
    }
}

export default connect(
    (state) => ({
        view: state.base.get('view')
    })
)(App);

이번에는, mapDispatchToProps 함수를 따로 만들어주지 않고 connect 내부에서 바로 정의를 해주었습니다. 주의 하실 점은, 애로우 함수를 작성 할 때, 화살표 다음 {} 객체를 () 괄호로 감싸야 한다는 점 입니다. 만약에 => ({ ... }) 이 아닌 => { } 으로 하시면, 객체가 생성되는것이 아니라 코드블록이 생기므로 오류가 발생합니다.

results matching ""

    No results matching ""