컴포넌트의 환경을 우리가 원하는 만큼 설정할 수 있게 해 주는 props!
text, boolean 타입도 보낼 수 있고 원하는 건 다 보낼 수 있다.
❗️문제는 너무 많은 props를 가지면 실수를 할 수도 있다는 점이다.
아니면 잘못된 props를 전달한다든지..
Btn에 한 가지 더 configuration(설정)을 해보자.
fontSize: 18
을 전달하도록 하기<!DOCTYPE html>
<html>
<body>
<div id="root"></div>
</body>
<script src="https://unpkg.com/react@17.0.2/umd/react.production.min.js"></script>
<script src="https://unpkg.com/react-dom@17.0.2/umd/react-dom.production.min.js"></script>
<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
<script type="text/babel">
function Btn({ text, fontSize }) {
console.log(text, "was rendered ✅");
return (
<button
style={{
backgroundColor: "tomato",
color: "white",
padding: "10px 20px",
border: 0,
borderRadius: 10,
//fontSize: fontSize 이름 같으니까 생략 가능
fontSize,
}}
>
{text}
</button>
);
}
function App() {
return (
<div>
<Btn text="Save Changes" fontSize={18} />
</div>
);
}
const root = document.getElementById("root");
ReactDOM.render(<App />, root);
</script>
</html>
<!DOCTYPE html>
<html>
<body>
<div id="root"></div>
</body>
<script src="https://unpkg.com/react@17.0.2/umd/react.production.min.js"></script>
<script src="https://unpkg.com/react-dom@17.0.2/umd/react-dom.production.min.js"></script>
<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
<script type="text/babel">
function Btn({ text, fontSize }) {
console.log(text, "was rendered ✅");
return (
<button
style={{
backgroundColor: "tomato",
color: "white",
padding: "10px 20px",
border: 0,
borderRadius: 10,
//fontSize: fontSize 이름 같으니까 생략 가능
fontSize,
}}
>
{text}
</button>
);
}
function App() {
return (
<div>
<Btn text="Save Changes" fontSize={18} />
<!--아래 처럼 작성하면 틀린 코드는 아니지만 사용하고 있는 컴포넌트 방식 내에서는 에러임!-->
<Btn text={12} fontSize="Changes" />
</div>
);
}
const root = document.getElementById("root");
ReactDOM.render(<App />, root);
</script>
</html>
아래 처럼 작성하면 틀린 코드는 아니지만 사용하고 있는 컴포넌트 방식 내에서는 에러임!
<Btn text={12} fontSize="Changes" />
PropTypes이라는 패키지를 사용해 보자. 이는 어떤 타입의 prop을 받고 있는지 체크해 준다.
스크립트에 prop-types 패키지를 작성한다.
<script src="https://unpkg.com/prop-types@15.7.2/prop-types.js"></script>
react 스크립트를 development로 변경한다.
<script src="https://unpkg.com/react@17.0.2/umd/react.development.js"></script>
prop 타입 적기
Btn.propTypes = {
text: PropTypes.string,
fontSize: PropTypes.number,
};
컴포넌트이름.propTypes = { prop이름: 타입, prop이름: 타입, }
<!DOCTYPE html>
<html>
<body>
<div id="root"></div>
</body>
<!--🔥 react 패키지의 모드를 development 모드로 바꿔주자-->
<script src="https://unpkg.com/react@17.0.2/umd/react.development.js"></script>
<script src="https://unpkg.com/react-dom@17.0.2/umd/react-dom.production.min.js"></script>
<!--🔥 prop-types 패키지 스크립트에 적어주자-->
<script src="https://unpkg.com/prop-types@15.7.2/prop-types.js"></script>
<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
<script type="text/babel">
function Btn({ text, fontSize }) {
console.log(text, "was rendered ✅");
return (
<button
style={{
backgroundColor: "tomato",
color: "white",
padding: "10px 20px",
border: 0,
borderRadius: 10,
//fontSize: fontSize 이름 같으니까 생략 가능
fontSize,
}}
>
{text}
</button>
);
}
<!--🔥 컴포넌트의 propTypes 설정하기-->
Btn.propTypes = {
text: PropTypes.string,
fontSize: PropTypes.number,
};
function App() {
return (
<div>
<Btn text="Save Changes" fontSize={18} />
<Btn text={12} fontSize="Changes" />
</div>
);
}
const root = document.getElementById("root");
ReactDOM.render(<App />, root);
</script>
</html>
prop을 필수조건으로 만들고 싶다면
isRequired
를 붙여 주면 된다.
Btn.propTypes = {
text: PropTypes.string.isRequired,
fontSize: PropTypes.number.isRequired,
};
text 프롭은 PropTypes.string, 그리고 필수조건으로 지정하고
fontSize 프롭은 PropTypes.number로 지정하고 옵셔널 하게 두자.
Btn.propTypes = {
text: PropTypes.string.isRequired,
fontSize: PropTypes.number,
};
컴포넌트에 프롭의 default value(기본 값)을 설정할 수 있는데, 이는 JS 덕분이다 ^ㅇ^!
폰트 사이즈에 디폴트 값을 주기 위해 Btn 컴포넌트에 프롭의 default value(기본 값)을 설정해 두자.
<!DOCTYPE html>
<html>
<body>
<div id="root"></div>
</body>
<script src="https://unpkg.com/react@17.0.2/umd/react.development.js"></script>
<script src="https://unpkg.com/react-dom@17.0.2/umd/react-dom.production.min.js"></script>
<script src="https://unpkg.com/prop-types@15.7.2/prop-types.js"></script>
<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
<script type="text/babel">
function Btn({ text, fontSize = 12 }) {
console.log(text, "was rendered ✅");
return (
<button
style={{
backgroundColor: "tomato",
color: "white",
padding: "10px 20px",
border: 0,
borderRadius: 10,
//fontSize: fontSize 이름 같으니까 생략 가능
fontSize,
}}
>
{text}
</button>
);
}
Btn.propTypes = {
text: PropTypes.string.isRequired,
fontSize: PropTypes.number,
};
function App() {
return (
<div>
<Btn text="Save Changes" fontSize={18} />
<Btn text="Continue" />
</div>
);
}
const root = document.getElementById("root");
ReactDOM.render(<App />, root);
</script>
</html>
이렇게 하면 fontSize를 설정하지 않은 두 번째 버튼의 폰트 크기는 기본 값인 16폰트가 된다.=
이렇게 정의되지 않은 변수에 관한 기본값을 줄 수 있다 ^3^~
이번 섹션에서는 설정 가능한 컴포너틑를 갖는 것이 얼마나 멋진 일인지를 배웠다.
복붙 안해도 되니까 을마나 좋게요!