REACT/[inflearn] 처음만난 리액트

13강. Composition vs Inheritance

web_seul 2022. 11. 30. 19:26
반응형

Composition 방법과 Inheritance

Composition : 여러개의 컴포넌트를 합쳐서 새로운 컴포넌트를 만드는 것, 합성

 

Composition 조합방법

- Containment : 하위 컴포넌트를 포함하는 형태의 합성 방법, Sidebar나 Dialog같은 Box형태의 컴포넌트는 자신의 하위 컴포넌터를 미리 알 수 없음, children이라는 props를 사용해서 조합

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

React.createElement(
  type,
  [props],
  [..children]
);


function WelcomDialog(props){
  return(
  
    //FancyBorder 컴포넌트 내의 모든 jsx태그는 children으로 전달됨
    <FancyBorder color="blue">
      <h1 className="Dialog-title">어서오세요</h1>
      <p className="Dialog-message">환영합니다.</p>
    </FancyBorder>
  );
}

 

여러개의 children집합이 필요한 경우 : 별도의 props를 정의하여 사용

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

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

 

- Specialization : 범용적인 개념을 구별되게 구체화하는 것, 기존의 객체지향 언어에서는 상속(Inheritance)를 사용하여 Specialization을 구현하지만 리액트에서는 합성(Composition)을 사용하여 Specialization을 구현

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

function WelcomDialog(props){
  return(
    <Dialog title="어서오세요" message="환영합니다" />
  );
}

 

Containment와 Specialization같이 사용하기

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

function SignUpDialog(props){
  const [nickname, setNickname] = useState('');
  const handleChange = (event) => {
    setNickname(event.target.value);
  }
  const handleSignUp = () => {
    alert(`어서오세요, ${nickname}님`);
  }
  
  return(
    <Dialog title="프로그램" message="닉네임 입력하세요">	//specialization, 값 전달
      <input value={nickname} onChange={handleChange} />	//containment, 정보등록
      <button onClick={handleSignUp}>가입하기</button>
    </Dialog>
  );
}

 

Inheritance : 상속, 다른 컴포넌트로부터 상속받아서 새로운 컴포넌트를 만드는 것

 

-> 복잡한 컴포넌트를 쪼개서 여러개의 컴포넌트로 만들고 만든 컴포넌트들을 조합해서 새로운 컴포넌트를 만들자

 

(실습) Card 컴포넌트 만들기

//card.jsx
function Card(props){
    const {title, backgroundColor, children} = props;

    return(
        <div
            style={{
                margin:8,
                padding:8,
                borderRadius:8,
                boxShadow:"0px 0px 4px grey",
                backgroundColor: backgroundColor || "white",
            }}
        >
            {title && <h1>{title}</h1>}
            {children}
        </div>
    )
}
export default Card;
//profileCard.jsx
import Card from "./Card";

function ProfileCard(props){
    return (
        <Card title="Inje Lee" backgroundColor="green">
            <p>안녕하세요, 소플입니다.</p>
            <p>저는 리액트 ..</p>
        </Card>
    );
}
export default ProfileCard;

 

반응형

'REACT > [inflearn] 처음만난 리액트' 카테고리의 다른 글

14강. Context  (0) 2022.12.02
12강. Lifting State Up  (0) 2022.11.22
11강. Forms  (0) 2022.11.21
10강. List and Keys  (0) 2022.11.11
9강. Conditional Rendering  (0) 2022.11.10