출저
- React 공식문서
- 위코드 수업자료
개발자란...
반복되는 코드는 그냥 못지나치지...컴포넌트란...
재사용 해야만 하지...// before -> 두 개의 내용을 표현하기 위한 두 개의 파일 isMyID ? <ProfileMyID /> : <ProfileOtherID /> // after -> 두 개의 내용을 표현하기 위한 하나의 파일 const MY_ID = '12345' const OTHER_ID = '54321' isMyID ? <Profile userID={MY_ID} /> : <Profile userID={OTHER_ID} />
위와 같이 Props를 통해 각각 달리 표시해주고 싶은 값들을 해당 컴포넌트에 넘겨주면 하나의 컴포넌트로 여러가지 형태로 사용할 수 있는 재사용성 높은 컴포넌트가 되는 것이죠!
// Modal.js
export default class Modal extends Component {
render() {
return (
<div className="Modal">
<Form format={signUpProps} />
</div>
);
}
}
const signUpProps = {
type: "signUp",
text: "회원가입",
data: [
{
type: "name",
text: "이름",
},
{
type: "email",
text: "이메일",
},
{
type: "password",
text: "비밀번호",
},
],
};
// Form.js
export default class Form extends Component {
render() {
const { format } = this.props;
return (
<FormLayout>
<h2>{format.text}</h2>
<div>
{format.data.map((input, idx) => (
<Input key={idx} type={input.type} text={input.text} />
))}
</div>
<Button value={format.text} />
{format.type === "signUp" && (
<p className="isAlreadyLogin">
이미 가입하셨나요? <span>로그인</span>
</p>
)}
</FormLayout>
);
}
}
Modal.js
의 signUpProps
는 <Form />
의 props로 전달되면서 컴포넌트 안쪽으로 전달되고 있는 값. 코드로 확인할 수 있다시피 하위 컴포넌트에서는 상위 컴포넌트에서 전달해주는 값에 따라 다른 데이터를 출력하게 된다.
Input
컴포넌트를 그려내기 위해 필요한 정보를 담고 있는 배열import React, { Component } from "react";
export default class FormLayout extends Component {
render() {
return (
<div className="Form">
<header>
<div className="logo" />
</header>
{this.props.children} // 태그로 감싸진 부분은 이곳에 들어옴!
</div>
);
}
}
// Form.js
<FormLayout>...</FormLayout>
로그인 / 회원가입 양쪽에서 모두 쓰이며, 같은 자리에 위치하고 있다. 이 부분을 children
을 사용해 묶어줄 수 있다.
리액트 컴포넌트는 props로 children이라는 걸 받는다. 이를 통해 컴포넌트 태그와 태그 사이에 들어오는 값, 다른 태그들을 배열로 받아올 수 있다.
일단 간단히만 설명하자면, 앞으로 <FormLayout>
과 </FormLayout>
로 감싸진 부분은 위 코드 예제의 this.props.children
자리에 들어오게 된다는 뜻이다.