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 |
댓글