Props
Props
는 컴포넌트 내부의 Immutable Data(변화하지 않는 데이터)를 처리할 때 사용된다.
JSX
내부에 { this.props.propsName }
이 있을 때, 컴포넌트를 렌더링할 때 propsName = "value"
이런 식으로 전달하면 된다. 아래의 예제를 보자.
index.js
1 | import React from 'react'; |
index.js
파일의 PropsTest
확장 태그에 name="jessie"
애트리뷰트를 추가했다.
PropsTest.js
1 | import React from 'react'; |
PropsTest
확장 태그를 구현한 PropsTest
클래스에서 애트리뷰트 값을 사용하기 위한 표현식은 { this.props.[애트리뷰트이름] }
이다.
index.js
파일에서 name
이라는 애트리뷰트를 추가했기 때문에 PropsTest.js
파일에서 { this.props.name }
이라고 작성하면 된다.
실행결과
this.props.children
this.props.childeren
은 기본적으로 갖고있는 props
로써, 별도의 props
이름 설정 없이 값을 설정할 수 있다. 아래의 예시를 보자.
index.js
1 | import React from 'react'; |
index.js
파일의 PropsTest
확장 태그 사이에 별도의 애트리뷰트 이름 없이 I love React!!!
라는 문구를 작성했다.
PropsTest.js
1 | import React from 'react'; |
애트리뷰트 값을 사용하기 위한 표현식은 { this.props.children }
이다.
실행결과
defaultProps - props 기본값 설정
컴포넌트 설정이 끝난 후, defaultProps
객체를 설정하면 된다. 아래의 예제는 name props
의 기본값을 ellie
로 설정하고 있다.
index.js
1 | import React from 'react'; |
index.js
파일의 PropsTest
확장 태그에 추가했던 name="jessie"
애트리뷰트를 삭제했다. 따라서 현재 설정된 name
애트리뷰트는 없다.
PropsTest.js
1 | import React from 'react'; |
PropsTest.js
파일에서 defaultProps
객체를 설정해주었다. name props
의 기본값을 ellie
로 설정했다. 이렇게 되면, index.js
파일에서 별도의 애트리뷰트를 설정하지 않았을 때 기본값으로 name
에 ellie
가 들어가는 것이다.
실행결과
PropTypes - 애트리뷰트 값 타입 지정
이 기능을 통하여 특정 props
값이 특정 type
이 아니거나 필수 props
인데 입력하지 않았을 경우 경고를 띄울 수 있다. Type
을 검증할 때는 Component
선언이 끝난 후, PropTypes
를 설정하면 된다.
단, React v15.5부터 PropTypes
가 React
에서 분리되었기 때문에 import
를 꼭 해줘야 한다.1
import PropTypes from 'prop-types';
그럼 아래의 예시를 보자.
PropsTest.js
1 | import React from 'react'; |
21번 줄에서 name
애트리뷰트 값 타입을 number
로 지정했다. 그런데, name
에 지정한 값의 타입은 string
이기 때문에 아래와 같이 에러가 발생한다.
Warning: Failed prop type: Invalid prop
name
of typestring
supplied toProps
, expectednumber
.
또한, 타입 지정 뒤에 isRequired
를 붙여주면 이 애트리뷰트가 필수로 입력이 되도록 설정할 수 있다. propTypes
를 아래와 같이 수정해보자.
1 | PropsTest.propTypes = { |
name
애트리뷰트 값 타입을 string
으로 지정해주었기 때문에 이 부분에서는 더 이상 에러가 발생하지 않는다. 하지만 age
애트리뷰트 값 타입 지정 뒤에 isRequired
를 붙여주었기 때문에 age
애트리뷰트가 필수로 있어야 한다. 그런데 age
애트리뷰트를 설정하지 않으면 아래와 같이 에러가 발생한다.
Warning: Failed prop type: The prop
age
is marked as required inProps
, but its value isundefined
.
PropTypes 종류
타입 지정 | 설명 |
---|---|
PropTypes.string | 문자열 |
PropTypes.array | 배열 |
PropTypes.bool | true/false |
PropTypes.func | 자바스크립트 함수 |
PropTypes.number | 숫자 |
PropTypes.object | 객체 |
PropTypes.symbol | 자바스크립트 symbol |
PropTypes.instanceOf(클래스명) | 클래스 객체 |
PropTypes.oneOf([‘값1’, ‘값2’]) | 두 값 중 하나 |
PropTypes.arrayOf(PropTypes.number) | 숫자 배열 |
어떤 타입이든 필수로 입력이 되도록 설정하기
타입 지정 뒤에 isRequired
를 붙여주면 된다. : PropTypes.any.isRequired