[React] PropTypes๋ก props ํ์ ๊ฒ์ฌ
PropTypes
๋ฆฌ์กํธ์์๋ props๋ฅผ ํตํด์ ๋ค๋ฅธ ์ปดํฌ๋ํธ์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ ์ ์๊ณ , ์ด๋ฅผ ํตํด ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค ์ ์๋ค.
์ฐ์ฐ์ฐฎ๊ฒ props์ ํ์ ๊ฒ์ฌ๋ฅผ ํ ์ ์๋ค๋ ๊ฒ์ ์๊ฒ ๋์ด ์ ๋ฆฌํด๋ณด๋ ค ํ๋ค.
props์ ํ์ ๊ฒ์ฌ๋ฅผ?
์์ ํซํ ํ์ ์คํฌ๋ฆฝํธ๋๋ฅผ ์ฐ๋ ์ด์ ์ค ํ๋๋ ํ์ ์ ์๊ฒฉํ๊ฒ ์ฒดํฌํด์ ์๋ฌ๋ฅผ ์ค์ด๊ธฐ ์ํจ๋ ์๋ค.
props์ ํ์ ๊ฒ์ฌ๊ฐ ํ์ํ ์ด์ ๋ ์ด์ ๊ฒฐ์ด ๊ฐ๋ค๊ณ ๋ณธ๋ค. ์ปดํฌ๋ํธ๊ฐ ์๋ชป๋ ํ์ ์ props๋ฅผ ์ ๋ฌ๋ฐ๊ฑฐ๋,
ํ์ํ props๊ฐ ๋๋ฝ๋๋ค๋ฉด ์๋์น ์์ ์๋ฌ๋ก ์ด์ด์ง ๊ฒ!.. PropTypes๋ ์ด๋ฐ ์๋ฌ๋ฅผ ๋ฐฉ์งํด์ค ์ ์๋ค.
์ฐธ๊ณ ๋ก ๋ฆฌ์กํธ ๊ณต์๋ฌธ์์ ๋ฐ๋ฅด๋ฉด PropTypes๋ React v15.5๋ถํฐ prop-types๋ผ๋ ํจํค์ง๋ก ๋ถ๋ฆฌ๋์๋ค!..
๊ทธ๋ผ prop-types๋ฅผ ์ด๋ป๊ฒ ์ธ๊น?? ๐ค
PropTypes ์ ์ฉํ๊ธฐ
์ค์น
์ผ๋จ ์ค์น๋ฅผ ํ์.
npm install prop-types
yarn์ ์ฐ๊ณ ์๋ค๋ฉด ์ด๋ ๊ฒ ์ค์นํ ์ ์๋ค.
yarn add prop-types
ํ์ ์ ๋ฐ๋ฅธ ๋ค์ํ ํ๋กํผํฐ
๋ฆฌ์กํธ ๊ณต์๋ฌธ์์ ๋ฐ๋ฅด๋ฉด ์๋์ ๊ฐ์ด ์ ํจ์ฑ ๊ฒ์ฌ๊ฐ ๊ฐ๋ฅํ๋ค.
import PropTypes from 'prop-types';
MyComponent.propTypes = {
// prop๊ฐ ํน์ JS ํ์์์ ์ ์ธํ ์ ์์ต๋๋ค.
// ์ด๊ฒ๋ค์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ชจ๋ ์ ํ ์ฌํญ์
๋๋ค.
optionalArray: PropTypes.array,
optionalBool: PropTypes.bool,
optionalFunc: PropTypes.func,
optionalNumber: PropTypes.number,
optionalObject: PropTypes.object,
optionalString: PropTypes.string,
}
๊ฐ์ฒด์ ์ ์ฉํ ์ ์๋ ์ ํจ์ฑ ๊ฒ์ฌ๋ ์ ๋ง ๋ง๋ค.
// ์ฌ๋ฌ ์ข
๋ฅ์ค ํ๋์ ์ข
๋ฅ๊ฐ ๋ ์ ์๋ ๊ฐ์ฒด
optionalUnion: PropTypes.oneOfType([
PropTypes.string,
PropTypes.number,
PropTypes.instanceOf(Message)
]),
// ํน์ ํ์
์ ํ๋กํผํฐ ๊ฐ๋ค์ ๊ฐ๋ ๊ฐ์ฒด
optionalObjectOf: PropTypes.objectOf(PropTypes.number),
// ํน์ ํํ๋ฅผ ๊ฐ๋ ๊ฐ์ฒด
optionalObjectWithShape: PropTypes.shape({
color: PropTypes.string,
fontSize: PropTypes.number
}),
// ์ถ๊ฐ ํ๋กํผํฐ์ ๋ํ ๊ฒฝ๊ณ ๊ฐ ์๋ ๊ฐ์ฒด
optionalObjectWithStrictShape: PropTypes.exact({
name: PropTypes.string,
quantity: PropTypes.number
}),
ํ์ prop ์ง์ ํ๊ธฐ
isRequired
๋ผ๋ ์์ฑ์ผ๋ก ๋ฐ๋์ ์ ๋ฌ๋ฐ์์ผ ํ๋ ๊ฐ์์ ๋ช
์ํ ์ ์๋ค.
// ์์ ์๋ ๊ฒ ๋ชจ๋ `isRequired`์ ์ฐ๊ฒฐํ์ฌ prop๊ฐ ์ ๊ณต๋์ง ์์์ ๋
// ๊ฒฝ๊ณ ๊ฐ ๋ณด์ด๋๋ก ํ ์ ์์ต๋๋ค.
requiredFunc: PropTypes.func.isRequired,
// ๋ชจ๋ ๋ฐ์ดํฐ ํ์
์ด ๊ฐ๋ฅํ ํ์๊ฐ
requiredAny: PropTypes.any.isRequired,
default props ์ง์ ํ๊ธฐ
props์ default ๊ฐ์ ๋ฃ๋ ๊ฒ์ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก๋ ๊ฐ๋ฅํ์ง๋ง, ์ด๋ ๊ฒ defaultProps ํ๋กํผํฐ๋ฅผ ํ ๋นํด์ ์ด๊ธฐ๊ฐ์ ์ง์ ํด์ค ์๋ ์๋ค.
Greeting.defaultProps = {
name: 'Stranger'
};
ํ์ฉ
User๋ผ๋ ์ปดํฌ๋ํธ๊ฐ ์์ ๋ ์ค์ ๋ก ์ด๋ ๊ฒ ์ง์ ํด์ค ์ ์๋ค.
User.propTypes = {
age: PropTypes.number,
name: PropTypes.string.isRequired,
};
๊ทธ๋ผ name ๊ฐ์ด ์์ ๊ฒฝ์ฐ ์ฝ์์์ ์ด๋ฐ ์๋ฌ๋ฅผ ๋ง๋ ์ ์๋ค.
์ฐธ๊ณ
๋ฆฌ์กํธ ๊ณต์ ๋ฌธ์
https://ko.reactjs.org/docs/typechecking-with-proptypes.html