Props
는 Properties의 줄임말로, 컴포넌트의 속성을 설정할 때 사용되는 요소이다.props
는 함수형 컴포넌트의 파라미터로 전달된다.props
는 JSX 내부에서 중괄호 {}
를 사용해 접근할 수 있다.import React from "react";
import Child from "./Child";
function Parent() {
return <Child name="React" />;
}
export default Parent;
import React from "react";
function Child(props) {
return <h1>Hello, {props.name}!</h1>;
}
export default Child;
결과:
Hello, React!
가 화면에 출력된다.
defaultProps
defaultProps
는 부모 컴포넌트에서 props를 전달하지 않았을 때 기본값을 설정하는 기능이다.function Greeting(props) {
return <h1>Hello, {props.name}!</h1>;
}
Greeting.defaultProps = {
name: "Guest",
};
export default Greeting;
결과:
name
이 전달되지 않으면 기본값인 Guest
가 출력된다: Hello, Guest!
클래스형 컴포넌트에서 defaultProps는 propTypes와 동일하게 static 키워드를 사용하거나 클래스에 바로 props의 defaultProps를 선언할 수 있다. (밑에 propTypes에 자세하게 설명함)
props.children
props.children
은 부모 컴포넌트의 태그 사이에 작성한 내용을 자식 컴포넌트에서 표시할 때 사용된다.function Parent() {
return (
<Wrapper>
<p>This is a child element!</p>
</Wrapper>
);
}
function Wrapper(props) {
return <div className="wrapper">{props.children}</div>;
}
export default Wrapper;
결과:
This is a child element!
가 div.wrapper
안에 표시된다.
propTypes
propTypes
는 컴포넌트의 props 타입을 정의하거나 필수 props를 지정할 때 사용된다.요약 : 데이터 타입 지정은 PropTypes.지정할타입, 필수값 지정은 PropTypes.지정할타입.isRequired을 통해 설정할 수 있다.
Proptypes의 장점
props 타입으로 인한 버그는 에러 핸들링이 어렵다. 왜냐하면 props 타입으로 인한 버그는 syntax error가 아니라서 콘솔에 에러메세지가 출력되지 않아 원인 파악이 어렵기 때문이다. 그렇기 때문에 Proptypes를 사용하면 예기치 못한 에러는 방지할 수 있고, 타입이 정의되어 있기 때문에 직관적으로 필요한 props의 타입을 알 수 있어 컴포넌트의 사용이 편리하고 유지보수가 쉽다.
함수형 컴포넌트에서 전달받은 props의 데이터 타입을 지정하기 위해서는 반드시 prop-types에서 PropTypes를 import해야한다.
그리고 props를 사용하는 컴포넌트 이름.PropTypes에 데이터 타입을 지정할 props:PropTypes.데이터 타입을 작성해 해당 props의 데이터 타입을 선언한다.
import PropTypes from "prop-types";
function Greeting(props) {
return <h1>Hello, {props.name}!</h1>;
}
Greeting.propTypes = {
name: PropTypes.string.isRequired,
};
export default Greeting;
결과:
name
이 전달되지 않으면 콘솔에 경고가 표시된다.
isRequired는 어떤 컴포넌트인지 상관 없이 props를 전달받은 자식 컴포넌트에서 해당 props를 필수로 전달하도록 지정한다.
PropTypes를 import하고, props의 타입을 지정하는 것과 동일하게 작성한 후 타입으의 뒤에 isRequired를 작성하면 된다.
번외) 클래스형 컴포넌트에서 props의 데이터 타입이나 기본값을 선언하는 방법은 두가지 이다. static키워드를 사용하거나, 클래스에 바로 props의 데이터 타입을 지정하는 방법이다.
import React, { Component } from 'react';
import PropTypes from 'prop-types';
export default class DataTypeClass extends Component {
render() {
return <div>{this.props.data}의 데이터 타입은 문자열 입니다.</div>;
}
}
DataTypeClass.propTypes = {
data: PropTypes.string.isRequired,
};
props
가 this.props
를 통해 접근된다.import React, { Component } from "react";
class Greeting extends Component {
render() {
return <h1>Hello, {this.props.name}!</h1>;
}
}
export default Greeting;
Props
는 컴포넌트 간 데이터를 전달하는 가장 기본적인 수단이다.defaultProps
와 propTypes
는 안전한 컴포넌트 사용을 돕는다.props.children
은 부모 태그 안의 내용을 자식 컴포넌트에서 렌더링할 때 사용된다.Props
는 UI의 재사용성과 확장성을 높이는 핵심 요소이다.