๐ Nomad Coder ReactJS๋ก ์ํ ์น ์๋น์ค ๋ง๋ค๊ธฐ
๊ฐ์๋ ธํธ (2021 Updated ver.)
Props(Properties)
์ปดํฌ๋ํธ์ '์ผ๋ฐฉํฅ์ ์ผ๋ก' ์ ๋ฌํ๋ ๊ฐ
๋ถ๋ชจ ์ปดํฌ๋ํธ๋ก๋ถํฐ ์์ ์ปดํฌ๋ํธ์ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ผ ์ ์๊ฒ ํ๋ ์ํด props๊ฐ ํ์ํ๋ค
State Practice์์ ๋ง๋ค์๋ ์ปดํฌ๋ํธ๋ ์์ ์ปดํฌ๋ํธ๊ฐ ๋
๋ฆฝ์ ์ผ๋ก ์กด์ฌํ ์ ์๋ค.
์์ ์ปดํฌ๋ํธ MinsToHrs
, KmToMile
๊ฐ ๋ถ๋ชจ ์ปดํฌ๋ํธ App()
์ ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋ค์ง ํ์๋ก ํ์ง ์๊ธฐ ๋๋ฌธ์ ์๋์์๋ ๋ฐ์ดํฐ ์ ๋ฌ์ ์ํ ์๋ก์ด ์์๋ฅผ ๋ง๋ค ๊ฒ์ด๋ค.
<script type="text/babel">
function ResetBtn() {
return (
<button
style={{
backgroundColor: 'red',
border: 0, // == border: 'none',
borderRadius: 20,
padding: 10,
color: 'white',
margin: '10px',
}}
>
reset
</button >
)
}
function ConfirmBtn() {
return (
<button
style={{
backgroundColor: 'blue',
border: 0, // == border: 'none',
borderRadius: 20,
padding: 10,
color: 'white',
margin: '10px',
}}
>
confirm
</button >
)
}
function App() {
return (
<div>
<ResetBtn />
<ConfirmBtn />
</div>)
// Btn์ ์๋ฌธ์๋ก ์ ์ด์ ๊ณ์ ์๋ฌ๊ฐ ๋ฌ์๋ค.
}
const root = document.getElementById("root")
ReactDOM.render(<App />, root);
</script>
props๋ฅผ ์ ๋ฌํ์ง ์์ ๋๋ ๊ฐ์ ์ญํ ์ ํ๋ ๋ฒํผ์ด๋ผ๋ ๋ค๋ฅธ ์์ฑ๊ฐ์ด ์๊ธฐ ๋๋ฌธ์ ๊ฐ์ ์ฝ๋๋ฅผ ๋ฐ๋ณตํด์ผ ํ๋ค. ๋ฒํผ์ ๋ก์ง์ด ๊ฐ์ง๋ง BackgroundColor๊ฐ ๋ค๋ฅด๊ณ , ๋ฒํผ์ ๋ด์ฉ์ด ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ๊ฐ์ ์ฝ๋๋ฅผ ๋ ๋ฒ ๋๋์ด ์ฐ๊ฒ ๋์๋ค.
์ด ๋, props๋ฅผ ์ด์ฉํด ๋ณํ๋๋ ์์ฑ๋ง ๋ฐ๋ก ์ ๋ฌ์ ํ๋ค๋ฉด ๋ถํ์ํ ๋ฐ๋ณต์ ์ค์ผ ์ ์๋ค.
<script type="text/babel">
function Btn({ name, color }) {
console.log(color);
return (
<button
style={{
backgroundColor: color,
border: 0, // == border: 'none',
borderRadius: 20,
padding: 10,
color: 'white',
margin: '10px',
}}
>
{name}
</button >
)
}
function App() {
return (
<div>
<Btn name="reset" color="red" />
<Btn name="confirm" color="blue" />
</div>)
// Btn์ ์๋ฌธ์๋ก ์ ์ด์ ๊ณ์ ์๋ฌ๊ฐ ๋ฌ์๋ค.
}
const root = document.getElementById("root")
ReactDOM.render(<App />, root);
</script>
๋์ ๋๋ ์ฐจ์ด์ ์
button
์ด๋ผ๋ ๊ณตํต์ ์ญํ ์ ํ๋<Btn /> Component
๋จ์ผํ<Btn /> Component
์์ ์ธ์๋ก ๋๊ฒจ์ฃผ๋name
,color
backgroundColor: color
,{name}
์ฒ๋ผ ๋ณ์๋ก ์ฐ์ด๋ 2๋ฒ์ ๊ฐApp()
์์ ์ต์ข ์ ์ผ๋ก rendering๋๋<Btn /> Component
ํํ<Btn name="reset" color="red" /> <Btn name="confirm" color="blue" />
name
, color
=> props
<Btn />
์ด๋ผ๋ ๊ณตํต ์ปดํฌ๋ํธ์ ๋ณํด์ผ ํ๋ ์์ฑ, ๋ฒํผ์ ๋ด์ฉ=name๊ณผ ์์=color์ props๋ก ์ฃผ๋ฉฐ <Btn />
์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฌ์ฉํ ์ ์๊ฒ ๋์๋ค.
์์ ์ปดํฌ๋ํธ์ ํ๋ผ๋ฏธํฐ ๊ฐ์ ์ค์ง ํ๋, props์ {์ค๋ธ์ ํธ}์ด๋ค.
<Btn />
์ปดํฌ๋ํธ์ ์์ฑ์ผ๋ก ๋ฃ์ ๋ชจ๋ ๊ฐ๋ค์ด props๋ผ๋ {์ค๋ธ์ ํธ}์ ๋ด๊ฒจ ์ ๋ฌ๋๋ค.function Btn(props) === function Btn({name, color})
Props๋
number
,string
,boolean
,ํจ์
๋ฑ ์ฌ๋ฌ ํํ๋ก ์ ๋ฌ ๊ฐ๋ฅํ๋ค.
<script type="text/babel">
function Btn({ name, onClick }) {
return (
<button
onClick={onClick}
style={{
backgroundColor: 'gray',
}}
>
{name}
</button >
)
}
function App() {
const [value, setValue] = React.useState("origin"); //name default ์ค์
const changeValue = () => setValue("change");
return (
<div>
<Btn name={value} onClick={changeValue} />
<Btn name="reset" />
</div>)
}
const root = document.getElementById("root")
ReactDOM.render(<App />, root);
</script>
์ด์ฒ๋ผ onClick
ํจ์๋ฅผ ๋ง๋ค์ด prop์ผ๋ก ์ ๋ฌํด ๋ฒํผ์ name
์ด ๋ฐ๋ ์ ์๋๋ก ๊ตฌํํ ์ ์๋ค.
๐ Check Point
์ฌ๊ธฐ์
App()
์<Btn />
์์ ์ฐ์ธonClick={changeValue}
์์ด๋ฒคํธ ๋ฆฌ์ค๋๊ฐ ์๋๋ผ prop์ด๋ค!
๋จ์ง ์ด๋ฆ์ด onClick์ธ prop์ด๋ค. ๋ง์ฝ<button onClick={}>
๊ฐ์ด HTML ์์ฑ์ ๋ฃ์๋ค๋ฉด ๊ทธ๊ฒ์ ์ด๋ฒคํธ ๋ฆฌ์ค๋์ด๋ค. ํ์ง๋ง<Btn />
์ฒ๋ผ ์ปค์คํ ์ปดํฌ๋ํธ์ ๋ฃ๋๋ค๋ฉด ๊ทธ๊ฑด ๋จ์ง prop์ผ ๋ฟ์ด๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ onClick ์ด๋ฒคํธ๋ฅผ ์ค์ ํ๊ณ ์ถ๋ค๋ฉด ์์ ์ฝ๋์ฒ๋ผ prop์ ๋งค๊ฐ ๋ณ์๋ก ์ ๋ฌํด์ผ ํ๋ค.
๋ฐ๋๋ก,<Btn style={{color : "green"}} />
์ ์ ์ฉ๋์ง ์๋๋ค.<Btn />
์ HTML ํ๊ทธ๊ฐ ์๋๊ธฐ ๋๋ฌธ์ด๋ค.
props ์์ฒด๋ก ๋งค๊ฐ๋ณ์๋ฅผ ์ ๋ฌํ๋ค๋ฉด ์๋์ ๊ฐ์ด ์จ์ผ ํ๋ค.
function Btn(props) {
return (
<button
style={{
backgroundColor: props.color,
border: 0, // == border: 'none',
borderRadius: 20,
padding: 10,
color: 'white',
margin: '10px',
}}
>
{props.name}
</button >
)
}
ํ์ง๋ง ๊ฐ๋ฐ์๋ค์ shortcut์ ์ข์ํ๋๊น..ใ ใ
Prop์ ํ์์ด ์ ํด์ ธ ์๋ ๊ฒ์ ์๋์ง๋ง, ๊ฐ๋ฐ ์๋์ ๋ฐ๋ผ ํ์์ ์ง์ผ์ผ ํ ๋๊ฐ ๋ง๋ค. ํ์ง๋ง ์ฝ๋๋ฅผ ์ง๋ค ์ค์๋ฅผ ํ ์๋ ์๊ณ , ๊ฐ๋ฐ์๋ค๊ฐ ํ์
์ ํ๋ค๋ณด๋ฉด ์ํต์ ๋ถ์ฌ๋ก Prop์ ์ ๋ฌ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์๋ ์๋ค. ์๋ฅผ ๋ค์ด ์์ฒ๋ผ name์ string ํ์
์ด์ด์ผ ํ์ง๋ง name์ ์ซ์๋ฅผ ๋ฃ๋ ๊ฒฝ์ฐ๊ฐ ๋ฐ์ํ๋ค๋ฉด? ์ฑ ๊ตฌํ์๋์์ ๋ฒ์ด๋ ๊ฒ์ด๋ค.
์ด๋ด ๋ ํ์ํ ๊ฒ์ด Prop Type์ด๋ค.
Prop Type์ ๋ง ๊ทธ๋๋ก Prop์ ํ์ ์ ์ ํด์ฃผ๋ ๊ฒ์ด๋ค.
ํน์๋ ๊ท์ฝ์ ๋ฐ๋ฅด์ง ์์์ ๊ฒฝ์ฐ, ์๋ฌ๋ฅผ ๋๋นํด ์ค์นํ๋ ๋ณดํ์ด๋ผ๊ณ ๋ณผ ์ ์๋ค.
ํ์ ์ ์ฌ์ฉํ๋ ค๋ฉด Prop Type ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์น๊ฐ ํ์ํ๋ค. ์คํฌ๋ฆฝํธ์ ์ถ๊ฐํด์ฃผ์.<script src="https://unpkg.com/prop-types@15.7.2/prop-types.js"></script>
<script type="text/babel">
function Btn({ name, onClick, padding }) {
return (
<button
onClick={onClick}
style={{
backgroundColor: 'gray',
border: 0,
borderRadius: padding,
padding, // === padding: padding,
color: 'white',
margin: '10px',
}}>
{name}
</button >
)
}
function App() {
const [value, setValue] = React.useState("origin");
const changeValue = () => setValue("change");
return (
<div>
<Btn name={value} onClick={changeValue} padding={20} />
<Btn name="reset" padding={30} />
</div>)
}
const root = document.getElementById("root")
ReactDOM.render(<App />, root);
</script>
function App() {
const [value, setValue] = React.useState("origin");
const changeValue = () => setValue("change");
return (
<div>
<Btn name={value} onClick={changeValue} padding={20} />
<Btn name={30} padding='reset' /> {/* ์ค๋ฅ ๋ฐ์์ง์ */}
</div>)
}
์ฌ๊ธฐ์ name๊ณผ padding์ ๊ฐ์ด ๋ฐ๋์ด ์
๋ ฅ์ด ๋์์ ๊ฒฝ์ฐ, <Btn />
์ ๋ด๊ฐ ๋ง๋ ์ปดํฌ๋ํธ์ด๊ธฐ ๋๋ฌธ์ React๋ ๋ฌด์์ด ์ ๋ชป ๋๋์ง ์ ์ง ๋ชปํ๋ค.
์๋ฌ๋ฉ์ธ์ง๊ฐ ์๋ค.
์ด๋ฌํ ๊ฒฝ์ฐ์์ ํ์ ์ ์ง์ ํด์ค๋ค๋ฉด?
// ํ๋กญ์ **ํ์
**์ ์ฃผ๋ ๋ฐฉ๋ฒ
Btn.propTypes = {
name: PropTypes.string,
padding: PropTypes.number,
}
function App() {
...
}
์ฝ์์์ ํ์ ์ด ๋ง์ง ์๋ค๋ฉฐ ๊ฒฝ๊ณ ํด ์ค๋ค.
๋, ๊ผญ ํ์ํ ๊ฐ์ด ์๋ค๋ฉด isRequired๋ฅผ ์ ์ฉํ๋ฉด ๋๋ค.
return (
<div>
<Btn name={value} onClick={changeValue} padding={20} />
<Btn padding={30} />
</div>)
2๋ฒ์งธ ๋ฒํผ์ name ๊ฐ์ ๋นผ๋จน์๋ค.
๊ตฌ๋์ ๋์ง๋ง ์ฝ์์ฐฝ์ฒ๋ผ name์ด required, ๊ผญ ํ์ํ prop์์ ์๋ ค์ฃผ๊ณ ์๋ค.
๊ฐ์ ์ง์ ํ์ง ์์๊ธฐ ๋๋ฌธ์ undefined๋ก ์ ์ฉ์ด ๋ ๋ชจ์ต์ ๋ณผ ์ ์๋ค.
์ด์ฒ๋ผ, Prop Type์ ์ฌ์ฉํด ์๋๋ฅผ ๋ช ํํ๊ฒ ํ์ํ ์ ์๋ค.
Prop์ด ์ด๋ค ํ์ ์ผ๋ก ์ฐ์ฌ์ผ ํ๋์ง, ์ด ์์ฑ์ ์๋ต ๊ฐ๋ฅํ ์์ฑ์ธ์ง ์๋์ง ๋ช ํํ๊ฒ ์ง๊ณ ๋์ด๊ฐ ์ ์๋ค.
Summary
Component๋ฅผ ๋ฐ๋ณตํด ์ฌ์ฌ์ฉํ ๋, ๋ฐ๋๋ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ ๊ฒ์ด props์ด๋ค.
๋ฆฌ์กํธ์ Key - 'ํ์ํ ๋ถ๋ถ๋ง re-rendering'ํ๋ ๊ฒ์ด props๋ก ํ์ฌ๊ธ ๋์ฑ interactive ํด ์ง ์ ์๋ค.