Skip to main content

5. Components and Props

[React] V. Components and Props

" 붕어빵 재료(props)를 붕어빵틀(component)에 넣으면 붕어빵(element)가 나온다. "

1. Components

리액트는 컴포넌트 기반의 구조이다. 그만큼 중요하다!

input(props)을 받으면 output(element)을 내놓는다. function, OOP의 Class의 개념에 비유된다.

component 는 두가지 종류가 있다. Function component, class component.

2. Props

property + s. component의 속성 component 에 전달할 다양한 정보를 담고 있는 JS object.

슈붕, 팥붕을 만들기 위해 다른 재료를 넣듯, 결과물 element를 다양하게 만들기 위해 넣는 속성.

1) Props의 특징 - Read-only

모든 react component 는 props에 대해 pure 함수 처럼 행동해야 한다.

pure 함수 : 받은 변수를 변경하지 않고, 같은 input에 같은 output을 내뱉는 함수. ex) 덧셈 함수

impure 함수 : 받은 변수를 수정하는 함수. ex) 객체를 받아 그 안의 속성을 바꾸는 함수

2) props의 사용법

	<Profile name="2ood" viewCount={1500}"/>

위의 JSX는 다음과 같이 props 로 정리된다.

React.creatElement(
Profile,
{
name: "2ood"
viewCount : 1500
},
null
)

3. Component 만들기

1) Function component 만들기

function Welcome(props) {
return <h1>안녕, {props.name}</h1>;
}

2) Class component 만들기

Component class 를 상속받아 만든다.

class Welcome extends React.Component {
render() {
return <h1>hello, {this.props.name}</h1>;
}
}

4) Rendering

주의. Component 이름은 항상 대문자로 시작해야 한다!

소문자로 시작하는 태그는 dom element 로 간주함.

const element <div />;

아래는 React component로 인식.

const element = <Welcome name="인제"/>

4. Component 합성, 추출

아래의 코드를 component 단위로 막 쪼개 보자!

function Comment(props) {
return (
<div className="comment">
<div className="user-info">
<img className="avatar"
src={props.author.avatarUrl}
alt={props.author.name}
/>
<div className="user-info-name">
{props.author.name}
</div>
</div>

<div className="comment-date">
{formatDate(props.date)}
</div>
);
}

쪼개면 다음과 같다.

function Comment(props) {
return (
<div className="comment">
<UserInfo user={props.author}/>

<div className="comment-date">
{formatDate(props.date)}
</div>
</div>
);
}

function UserInfo(props){
return (
<div className="user-info">
<Avatar user={props.user} />
<div className="user-info-name">
{props.user.name}
</div>
</div>
);
}

function Avatar(props) {
return (
<img className="avatar"
src={props.user.avatarUrl}
alt={props.user.name}
/>
);
}