본문 바로가기
Front-End/React

[React] 11. 합성 vs 상속

by hongdor 2021. 2. 3.
728x90

출처: React 공식 홈페이지

합성 (Composition) vs 상속 (Inheritance) – React (reactjs.org)

 

 

1. 합성을 사용

> React는 강력한 합성 모델을 가지고 있으며, 상속 대신 합성을 사용하여 컴포넌트 간에 코드를 재사용하는 것이 좋다.

 

 

2. 컴포넌트에서 다른 컴포넌트를 담기


(1) 상위 컴포넌트의 어떠한 자식 태그들이 올지 모르는 경우
 > props.children을 이용해서 상위컴포넌트의 자식들을 그대로 출력한다.

 

예시)

function FancyBorder(props) {
  return (
    <div className={'FancyBorder FancyBorder-' + props.color}>
      {props.children}
    </div>
  );
}

function WelcomeDialog() {
  return (
    <FancyBorder color="blue">
      <h1 className="Dialog-title">
        Welcome
      </h1>
      <p className="Dialog-message">
        Thank you for visiting our spacecraft!
      </p>
    </FancyBorder>
  );
}

 

>> props.children 이

      <h1 className="Dialog-title">
        Welcome
      </h1>
      <p className="Dialog-message">
        Thank you for visiting our spacecraft!
      </p>

를 받는다.

 

 

3. props.children 대신 직접 정의

 

예시)

function SplitPane(props) {
  return (
    <div className="SplitPane">
      <div className="SplitPane-left">
        {props.left}
      </div>
      <div className="SplitPane-right">
        {props.right}
      </div>
    </div>
  );
}

function App() {
  return (
    <SplitPane
      left={
        <Contacts />
      }
      right={
        <Chat />
      } />
  );
}

 

 

4. 특수화

> 일반적인 컴포넌트를 기반으로 더 구체적인 컴포넌트를 구현한다.
> Dialog 컴포넌트를 기반으로 WelcomeDialog()를 만드는 예시


예시)

function Dialog(props) {
  return (
    <FancyBorder color="blue">
      <h1 className="Dialog-title">
        {props.title}
      </h1>
      <p className="Dialog-message">
        {props.message}
      </p>
    </FancyBorder>
  );
}

function WelcomeDialog() {
  return (
    <Dialog
      title="Welcome"
      message="Thank you for visiting our spacecraft!" />
  );
}

 

> 특수화는 클래스 컴포넌트에서도 적용된다.
예시)

function Dialog(props) {
  return (
    <FancyBorder color="blue">
      <h1 className="Dialog-title">
        {props.title}
      </h1>
      <p className="Dialog-message">
        {props.message}
      </p>
      {props.children}
    </FancyBorder>
  );
}

class SignUpDialog extends React.Component {
  constructor(props) {
    super(props);
    this.handleChange = this.handleChange.bind(this);
    this.handleSignUp = this.handleSignUp.bind(this);
    this.state = {login: ''};
  }

  render() {
    return (
      <Dialog title="Mars Exploration Program"
              message="How should we refer to you?">
        <input value={this.state.login}
               onChange={this.handleChange} />
        <button onClick={this.handleSignUp}>
          Sign Me Up!
        </button>
      </Dialog>
    );
  }

  handleChange(e) {
    this.setState({login: e.target.value});
  }

  handleSignUp() {
    alert(`Welcome aboard, ${this.state.login}!`);
  }
}

 

 

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

728x90

'Front-End > React' 카테고리의 다른 글

[react-redux] 1. 일반 어플리케이션  (0) 2021.02.17
[React] 12. React로 사고하기(마지막)  (0) 2021.02.03
[React] 10. 조건부 렌더링  (0) 2021.02.03
[React] 9. 폼  (0) 2021.02.03
[React] 8. 리스트와 Key  (0) 2021.02.03

댓글