합성 (Composition) vs 상속 (Inheritance)
React는 강력한 합성 모델을 가지고 있으며, 상속 대신 합성을 사용하여 컴포넌트 간에 코드를 재사용한다.
컴포넌트에서 다른 컴포넌트 담기
props children으로 컴포넌트를 전달해서 컴포넌트를 랜더링 할 수 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| 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> ); }
|
특수화
일반적인 컴포넌트에서 특수한 경우에 컴포넌트를 뽑아 낼 수 있다. 예를 들어서 Dialog 컴포넌트는 일반적인 컴포넌트라고 할 수 있고 WelcomeDialog는 특수한 컴포넌트라고 할 수 있다.
이런 컴포넌트를 그릴 때에도 합성을 사용할 수 있는데, 구체적인 컴포넌트에서 일반적인 컴포넌트를 담아서 그리는 것이다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| 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!" /> ); }
ReactDOM.render(<WelcomeDialog />, document.getElementById("root"));
|
마찬가지로 클래스 컴포넌트에서도 합성을 사용할 수 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| 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}!`); } }
|
상속은?
대부분 사용하지 않는다. React에서는 Props로 어떤 값도 전달 가능하기 때문에 모양과 동작을 유연하게 커스터마이징 할 수 있다.
또한, JavaScript이기 때문에 모듈로 분리할 수 도 있고 필요할때 import 하기도 가능하다.