function Welcome(props) {
return <h1>Hello, {props.name}</h1>;
}
class Welcome extends React.Component {
render() {
return <h1>Hello, {this.props.name}</h1>
}
}
이 전까지는 DOM 태그만을 사용해 React 엘리먼트는 나타냄
const element = <div />;
React 엘리먼트는 사용자 정의 컴포넌트로도 나타낼 수 있다.
const element = <Welcome name="Sara" />;
React가 사용자 정의 컴포넌트로 작성한 엘리먼트를 발견하면 JSX 어트리뷰트와 자식을 해당 컴포넌트에 단일 객체로 전달
⇒ 이 객체를 props라고 한다.
// 예시: 페이지에서 "Hello, Sara"를 렌더링
function Welcome(props) {
return <h1>Hello, {props.name}</h1>;
}
const root = ReactDOM.createRoot(document.getElementById('root'));
const element = <Welcome name="Sara" />;
root.render(element);
<Welcome name="Sara" />
엘리먼트로 root.render()
를 호출{name: 'Sara'}
를 props로 하여 Welcome
컴포넌트를 호출Welcome
컴포넌트는 결과적으로 <h1>Hello, Sara</h1>
엘리먼트를 반환<h1>Hello, Sara</h1>
엘리먼트와 일치하도록 DOM을 효율적으로 업데이트컴포넌트 네이밍
- 컴포넌트의 이름은 항상 대문자로 시작
- React는 소문자로 시작하는 컴포넌트를 DOM 태그로 처리
// Welcome 컴포넌트를 App 컴포넌트 내에서 여러 번 렌더링
function Welcome(props) {
return <h1>Hello, {props.name}</h1>;
}
function App() {
return (
<div>
<Welcome name="Sara" />
<Welcome name="Lisa" />
<Welcome name="Denniel" />
</div>
);
}
컴포넌트를 여러 개의 작은 컴포넌트로 나눌 수 있다.
function Comment(props) {
return (
<div className="Comment">
<div className="UserInfo">
<img className="Avatar"
src={props.author.avatarUrl}
alt={props.author.name}
/>
<div className="UserInfo-name">
{props.author.name}
</div>
</div>
<div className="Comment-text">
{props.text}
</div>
<div className="Comment-date">
{formatDate(props.date)}
</div>
</div>
);
}
Avatar
컴포넌트 추출author
→ user
function Avatar(props) {
return (
<img className="Avatar"
src={props.user.avatarUrl}
alt={props.user.name}
/>
)
}
UserInfo
컴포넌트 추출function UserInfo(props) {
return (
<div className="UserInfo">
<Avatar user={props.user} />
<div className="UserInfo-name">
{props.user.name}
</div>
</div>
)
}
Comment
에 Avatar
컴포넌트, UserInfo
컴포넌트 적용function Comment(props) {
return (
<div className="Comment">
<UserInfo user={props.author} />
<div className="Comment-text">
{props.text}
</div>
<div className="Comment-date">
{formatDate(props.date)}
</div>
</div>
);
}
처음에는 컴포넌트를 추출하는 작업이 지루해 보일 수 있다. 하지만 재사용 가능한 컴포넌트를 만들어 놓는 것은 더 큰 앱을 작업할 때 두각을 나타낸다. UI 일부가 여러 번 사용되거나, UI 일부가 자체적으로 복잡한 경우에는 별도의 컴포넌트를 만드는 것이 좋다.
function sum(a, b) {
return a + b;
}
function withdraw(account, amount) {
account.total += amount;
}