๐ Props
๋ฆฌ์กํธ์์ ๋ฐ์ดํฐ๋ ์์์ ์๋๋ก, ๋ถ๋ชจ ์ปดํฌ๋ํธ์์ ์์ ์ปดํฌ๋ํธ๋ก ์งํ๋๋ ๋จ๋ฐฉํฅ์ ํ๋ฆ์ ๊ฐ์ง๋ค. ์ด ๋ฐ์ดํฐ์ ํ๋ฆ ์๋์์ ์์์๊ฒ ์ ๋ฌ๋๋ ๋ฐ์ดํฐ๋ฅผ Props ๋ผ๊ณ ํ๋ค.

์ด์ ๊ธ์ ์์ (๋ฒํผ ํด๋ฆญ์ ์ซ์ ๋ณ๊ฒฝ) ์์ ๋ฅผ ์ปดํฌ๋ํธ๋ก ๊ตฌํํด ๋ณด๊ฒ ๋ค.
Props์ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ์ฌ์ฉ๋ฒ์ด๋ค.
- Button ์ปดํฌ๋ํธ(src/Button.js)
function Button(props) {
return <button onClick={props.onClick}>{props.text}</button>;
}
export default Button;
๋ฒํผ ์ปดํฌ๋ํธ๋ฅผ ์์ฑํ๋ค. ์ด ์ปดํฌ๋ํธ์์๋ props๋ผ๋ ๊ฐ์ฒด๋ฅผ ๋ฐ๊ณ , ๊ทธ ๊ฐ์ฒด์ onClick, text ์์๋ค์ ์ฌ์ฉํ๋ค.
- App ์ปดํฌ๋ํธ(src/App.js)
import React, { useState } from 'react';
import Button from './Button';
function App() {
const [number, setNumber] = useState(0);
function onClickIncrease() {
setNumber(number + 1);
}
function onClickDecrease() {
setNumber(number - 1);
}
return (
<div>
<div>๊ฐ : {number}</div>
<Button onClick={onClickIncrease} text="+1" />
<Button onClick={onClickDecrease} text="-1" />
</div>
);
}
export default App;
๋ฒํผ ์ปดํฌ๋ํธ๋ฅผ ํธ์ถํ๋ค. ๋ฒํผ ์ปดํฌ๋ํธ๋ฅผ ํธ์ถํ ๋, ์ปดํฌ๋ํธ์์ ํ์ํ onClick, text๊ฐ์ ๋ฃ์ด์ค๋ค.
๐ ๋น๊ตฌ์กฐํ ํ ๋น
์์ ๋ฐฉ๋ฒ๋ณด๋ค ์กฐ๊ธ ์ ๊ทธ๋ ์ด๋ ๋ ์ฌ์ฉ๋ฒ ์ค ํ๋์ด๋ค.
๊ฐ์ฒด์ ๊ตฌ์กฐ๋ฅผ ํด์ฒดํ๊ณ ๋ณ์์ ๋์ ํ๋ ๊ฒ์ด๋ค.
๋ฒํผ ์ปดํฌ๋ํธ๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ๋ณ๊ฒฝํ๋ค.
function Button({ text, onClick }) {
return <button onClick={onClick}>{text}</button>;
}
export default Button;
๊ธฐ์กด์ ๋ฐ๊ณ ์๋ props๋ผ๋ ๊ฐ์ฒด ์์ ๊ฐ text์ onClick์ ์ถ์ถํด์ ๊ฐ๊ฐ ๋ณ์์ ๊ฐ์ ํ ๋นํ๊ณ ์ฌ์ฉํ๋ค.
์ด ๋ฐฉ๋ฒ, ๋น๊ตฌ์กฐํ ํ ๋น์ ์ฌ์ฉํ๋ฉด, ๋จ์ํ props๋ง ์์ฑํ์ ๋ ๋ณด๋ค ์ฝ๋์ ๊ฐ๋ ์ฑ์ด ์ข๊ณ , ๊ฐ ์ปดํฌ๋ํธ๋ง๋ค ํ์ํ ๋ฐ์ดํฐ์ ์ข ๋ฅ๋ฅผ ์ฝ๊ฒ ํ์ ํ ์ ์๋ค.
๐ Children
์ง๊ธ๊น์ง๋ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ ๋ ๋ซํ ๊ดํธ๋ฅผ ์ฌ์ฉํ๋ค.
Children์ ํตํด ์ปดํฌ๋ํธ ์์ ๋ค๋ฅธ ํ๊ทธ๋ ์ปดํฌ๋ํธ๋ฅผ ๋ด์ ์ ์๋ค.
- Layout ์ปดํฌ๋ํธ (src/Layout.js)
import styles from './Layout.module.css';
function Layout({ children }) {
return <div className={styles.container}>{children}</div>;
}
export default Layout;
- Layout CSS (src/Layout.module.css)
.container {
padding: 10px;
border: 1px solid black;
border-radius: 10px;
}
ํจ๋ฉ๊ณผ ๋ณด๋๋ฅผ ๊ฐ๋ Layout ์ปดํฌ๋ํธ๋ฅผ ์์ฑํ๋ค. Props๋ก chidren์ ๋ฐ๋๋ค.
chidren ์์ฑ์ ๋ค๋ฅธ ์์ฑ๋ค์ด ์ปดํฌ๋ํธ ํ๊ทธ์์ ๊ฐ์ ๋์ ํ๋ ๊ฒ๊ณผ ๋ฌ๋ฆฌ, ์์ ํ๊ทธ๋ฅผ ๊ฐ์ผ๋ก ๊ฐ๋๋ค.
- App ์ปดํฌ๋ํธ (src/App.js)
import React, { useState } from 'react';
import Button from './Button';
import Layout from './Layout';
function App() {
const [number, setNumber] = useState(0);
function onClickIncrease() {
setNumber(number + 1);
}
function onClickDecrease() {
setNumber(number - 1);
}
return (
<Layout>
<div>๊ฐ : {number}</div>
<Button onClick={onClickIncrease} text="+1" />
<Button onClick={onClickDecrease} text="-1" />
</Layout>
);
}
export default App;
div ํ๊ทธ์์ Layout ํ๊ทธ๋ก ๋ณ๊ฒฝํด์ฃผ์๋ค. Layout์ children์ div ํ๊ทธ ํ๋์ Button ์ปดํฌ๋ํธ ๋๊ฐ๋ก ์ด๋ฃจ์ด์ง ์์ ํ๊ทธ๋ฅผ ๊ทธ๋๋ก ์ ๋ฌํ๋ค.

๋ง์ง๋ง์ผ๋ก,
์ปดํฌ๋ํธ๋ง๋ค ํ์ํ ๋ฐ์ดํฐ๊ฐ ๋ค๋ฅด๋ฏ๋ก ํ๋ก์ ํธ์ ๊ตฌ์กฐ ์ค๊ณ์ ์ปดํฌ๋ํธ ๋ค์ด๋ฐ์ ํ์คํ๊ฒ ํด์ผํ๋ค!
์ฐธ๊ณ ๋ฐ ์ฌ์ง ์ถ์ฒ: https://codemate.kr/project/%EC%BD%94%EB%AE%A4%EB%8B%88%ED%8B%B0-%EB%AA%A8%EA%B0%81%EC%BD%94-WEB-%EB%A9%94%EC%9D%B4%ED%8A%B8-%EC%9B%B9-%EC%8B%AC%ED%99%94-%EB%A6%AC%EC%95%A1%ED%8A%B8-%ED%8E%B8/5-1.-Props
'React > ๊ฐ๋ ์ ๋ฆฌ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [React]๊ตฌ๊ตฌ๋จ ์ถ๋ ฅํ๊ธฐ (0) | 2022.01.16 |
|---|---|
| React #3. Hook ๊ณผ State (0) | 2022.01.15 |
| React #1. ํ๋ก์ ํธ ์์ฑ๊ณผ ์คํ (0) | 2022.01.12 |
| React #2. CSS (0) | 2022.01.12 |