컴포넌트를 정의하는 방법은 두가지가 있습니다.
function Hello(props) {
return <h1>Hello, {props.name}</h1>;
}
이 함수는 데이터를 가진 하나의 props 객체를 인자로 받은 후 React element를 반환하므로 유효한 React component 입니다.
class Hello extends React.Component {
render() {
return <h1>Hello, {this.props.name}</h1>;
}
}
또한, ES6 class를 사용하여 component를 정의할 수 있습니다. React의 관점에서 볼 때 두가지 유형의 컴포넌트는 동일합니다.
React element는 DOM 태그로 나타낼 뿐만 아니라 사용자 정의 컴포넌트로도 나타낼 수 있습니다.
const myElement = <Hello name="Tom" />;
React가 사용자 정의 컴포넌트로 작성한 엘리먼트를 발견하면 JSX attribute와 children을 해당 컴포넌트에 단일 객체로 전달합니다. 이 객체가 바로 props 입니다.
예를 들자면, 다음과 같은 예시를 확인 해보겠습니다.
function Hello(props){
return <h1>Hello, {props.name}</h1>;
}
const myElement = <Hello name="Tom" />;
ReactDOM.render(
element,
document.getElementById('root')
);
이 예시에서는 아래와 같은 순서로 렌더링이 됩니다.
<Hello name="Tom" />
엘리먼트로 ReactDOM.render()
를 호출합니다.{name: 'Tom'}
을 props로 하여 Hello
컴포넌트를 호출합니다.Hello
컴포넌트는 결과적으로 <h1>Hello, Tom</h1>
엘리먼트를 반환합니다.<h1>Hello, Tom</h1>
엘리먼트와 일치하도록 DOM을 효율적으로 업데이트 합니다.컴포넌트의 이름은 항상 대문자로 시작해야 합니다.
React는 소문자로 시작하는 컴포넌트를 DOM 태그로 처리하기 때문에 컴포넌트를 나타내고 싶다면 대문자로 시작해야 합니다.
컴포넌트는 자신의 output에 다른 컴포넌트를 참조할 수 있습니다. 이는 모든 세부 단계에서 동일한 level의 컴포넌트를 사용할 수 있음을 의마합니다. React 앱에서는 button, form, dialog, screen 등의 모든 것들을 대부분 컴포넌트로 표현됩니다.
예를 들얼 Hello
를 여러번 렌더링하는 App 컴포넌트를 만들 수 있습니다.
function Hello(props){
return <h1>Hello, {props.name}</h1>;
}
function App(){
return (
<div>
<Hello name="Tom" />
<Hello name="Kim" />
<Hello name="Ahn" />
</div>
);
}
ReactDOM.render(
<App />,
document.getElementById('root')
);
일반적으로 새 React앱은 최상위에 단일 App
컴포넌트를 가지고 있습니다. 하지만 기존 앱에 React를 통합하는 경우 Button
과 같은 작은 컴포넌트부터 시작해서 뷰 계층 상단으로 올라가면서 점진적으로 작업해야 할 수 있습니다.
컴포넌트는 여러개의 작은 컴포넌트로 나눌 수 있습니다. 재사용 가능한 컴포넌트를 만들어 놓는 것은 더 큰 앱에서 작업할 때 두각을 나타냅니다. UI 일부가 여러 번 사용되거나, UI 일부가 자체적으로 복잡한 경우에는 별도의 컴포넌트로 만드는 게 좋습니다.
함수 컴포넌트나 클래스 컴포넌트 모두 컴포넌트의 자체 props를 수정해서는 안됩니다. 모든 React 컴포넌트는 자신의 props를 다룰 때 반드시 pure function처럼 동작해야 합니다.