본문으로 바로가기

composition

category React 2020. 11. 15. 03:58

상속?

Facebook에서는 수천 개의 React 컴포넌트를 사용하지만, 컴포넌트를 상속 계층 구조로 작성을 권장할만한 사례를 아직 찾지 못했습니다.

-리액트 공식 문서 중-

적어도 리액트를 사용할 때는 상속을 잊어도 좋다는 말일 것이다

그렇다면 컴포넌트 끼리 코드 재사용이 필요할 땐 어떻게 할까?

합성

컴포넌트 담기

props.children는 컴포넌트에 들어올 자식을 나타내는 값이다

아래의 코드를 보자

function Parent(props) {
    return (
        <div>
            <h1>I'm Parent</h1>
            <div style={{border: '1px solid black'}}>
                <h2>this place is children's</h2>
                {props.children}
            </div>
        </div>
    );
}

부모 컴포넌트는 언젠가 자기의 자식으로 들어올 props.children을 출력할 공간을 마련해둔 채 렌더링되고 있다

이제 부모 컴포넌트에 자식을 담아서 렌더링해보자

function Child(){
    return (
        <Parent>
            <h3>I'm Child</h3>
        </Parent>
    )
}

ReactDOM.render(
  <Child/>,
  document.querySelector('#root')
);

쉽게 설명해보자면 Child 컴포넌트에서 Parent태그로 감싸고 있는 JSX를 children값으로 건내주고

Parent 컴포넌트에서 그 children을 {props.children}로 그대로 출력하고 있는 것


나는 처음에 태그만 보고 당연히 이렇게 나오는 거 아니야? 했다가 Parent에 있는 props.children을 지워보고 당연한게 아닌 것을 깨달았다..

function Child(){
    return (
        <Parent children={'<h3>I\'m Child</h3>'}/>
    )
}

대충 이런 코드로 해석된다고 이해하면 될 것 같다

물론 이렇게하면 제대로 된 결과를 얻을 수 없다

특수화

이 경우가 상속과 비슷하다

function Introduce(props){
    return(
        <div>
            <h1>Hello, my name is {props.myName}</h1>
            <p>
                I am the creator of Speaking of English, a blog for intermediate English learners who want to become more fluent in the language. I am originally from the United States and I currently live in Germany. I have been a teacher since 2008, and specialize in business writing and IELTS preparation. Before becoming a teacher, I worked as a copyeditor for government agencies in Washington DC and as a ghostwriter for startup founders and independent consultants around the world. In my free time, I enjoy hiking, practicing photography, and exploring the city by bike.
            </p>
        </div>
    )
}

여기 자기소개 틀의 컴포넌트가 있다

매우 범용적으로 사용될 수 있는 컴포넌트이지만 실제로 사용할 때는 누군가의 이름이 들어가야한다

function Jane(){
    return(
        <Introduce myName="Jane"/>
    )
}

마치 Jane이 Introduce를 상속한 것 같은 모습..

이것이 리액트의 합성이다

'React' 카테고리의 다른 글

Effect Hook  (0) 2020.11.18
State Hook  (0) 2020.11.17
state 끌어올리기  (0) 2020.11.14
controlled component  (0) 2020.11.13
list, key  (0) 2020.11.06