๐จ ์ปดํฌ๋ํธ์ ์ฌ์ฌ์ฉ
React๋ component๋ก ์ด๋ฃจ์ด์ ธ ์๊ณ , ๋ฐ์ดํฐ๋ง ๋ฌ๋ผ์ง๋ฉด์ ๋์ผํ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฌ์ฉํ ์ ์์ต๋๋ค.
์๋์ ์ปค์คํ ์ปดํฌ๋ํธ <Hobby /> ์ MY_HOBBY์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ฐ ๋ค๋ฅด๊ฒ props๋ก ์ ๋ฌํ๋ ์ฝ๋๋ฅผ ๋ณด๊ฒ ์ต๋๋ค.
const MY_HOBBY = [
{
title : "Movie",
description : "Watch movie at theater",
},
{
title : "Running",
description : "Run 3km",
},
{
title : "Football",
description : "Kick a ball with our team",
},
];
1. spread operator๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐฐ์ด์ ์ธ๋ฑ์ค๋ก props๋ฅผ ์ ๋ฌํฉ๋๋ค.
import Hobby from "./components/Hobby.jsx";
import { MY_HOBBY } from "./data.js";
function App() {
return (
<>
{/*...codes...*/}
<section>
<ul>
<Hobby {...MY_HOBBY[0]} />
<Hobby {...MY_HOBBY[1]} />
<Hobby {...MY_HOBBY[2]} />
</ul>
</section>
{/*...codes...*/}
</>
);
}
export default App;
2. ์ปค์คํ ์ปดํฌ๋ํธ ์์์๋ ์ธ์๋ก์ ์์ฑ์ ๋ฐ์ ์ ์๋๋ฐ, ์ฌ๊ธฐ์ ์๋ฐ์คํฌ๋ฆฝํธ ๋ฌธ๋ฒ์ธ ๊ตฌ์กฐ ๋ถํด ํ ๋น์ ์ด์ฉํฉ๋๋ค.
export default function Hobby({ title, description }) {
return (
<li>
<h2>{title}</h2>
<p>{desription}</p>
</li>
)
}
์ด ๋ฐฉ์๋ ์ข์ง๋ง ๋ฆฌ์คํธ์ ๊ฐ์๊ฐ ๋ฌ๋ผ์ง๋ฉด ๋ ๋๋ง ๊ณผ์ ์์ ๊นจ์ง๊ฑฐ๋ ๋ํ๋์ง ์์ ์ ์์ต๋๋ค.
๊ทธ๋์ ๋ฐ์ดํฐ์ ๊ฐ์์ ๋ฐ๋ผ ๋์ ์ผ๋ก ์ปดํฌ๋ํธ๋ฅผ ๋ ๋ํ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
import Hobbies from "./components/Hobby.jsx";
import { MY_HOBBY } from "./data.js";
function App() {
return (
<>
{/* codes */}
<section>
<Hobbies {...MY_HOBBY} />
</section>
{/* codes */}
</>
);
}
export default App;
export default function Hobbies() {
return (
<ul>
{MY_HOBBY.map((hobby) => (
<Hobby key={hobby.title} {...hobby} />
)
)}
</ul>
);
}
์ค๊ดํธ ์์ map ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฐฐ์ด์ด๋ ๊ฐ์ฒด๋ก ๋ ๋ฆฌ์คํธ๋ฅผ ๋์ ์ผ๋ก ๋ ๋ํ ์ ์์ต๋๋ค.
โ WARNING
map ๋ฉ์๋ ์ฌ์ฉ ์ ๊ฐ ๋ฆฌ์คํธ์๋ ๊ณ ์ ํ key ์์ฑ์ด ์์ด์ผ ํฉ๋๋ค. React๋ ๋์ค์ ๋ฐ์ดํฐ๋ฅผ insert, delete, reorder ํ ๋ ์ฐธ์กฐํ key๊ฐ์ ํ์๋ก ํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
๐จ ์์ ์ปดํฌ๋ํธ ํจ์๋ฅผ prop์ผ๋ก ๋ฐ๊ธฐ
on์ผ๋ก ์์ํ๋ ์ด๋ฒคํธ ๋ฆฌ์ค๋(ex. onClick, onChange, ...)๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ๋์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
import ListButton from "./ListButton.jsx";
export default function ShowTemplate() {
function handleSelect(selectedButton) {
setSelectedContent(selectedButton);
}
return (
<section>
<ListButton
isSelected={selectedContent === "movie"}
onClick={() => handleSelect("movie")}
>
Movie
</ListButton>
<ListButton
isSelected={selectedContent === "running"}
onClick={() => handleSelect("running")}
>
Running
</ListButton>
<ListButton
isSelected={selectedContent === "football"}
onClick={() => handleSelect("football")}
>
Football
</ListButton>
</section>
);
}
export default function listButton({ children, onSelect }) {
return (
<li>
<button onClick={onSelect}>
{children}
</button>
</li>
);
}
1. ์ด๋ฒคํธ๋ฅผ ์ฒญ์ทจํ๋ ํด๋น ํ์ ์ปดํฌ๋ํธ์ html tag(์์์๋ button์ด ์ด์ ํด๋น) ์ on- prop์ ์ถ๊ฐํฉ๋๋ค.
2. onClick์ ์ปดํฌ๋ํธ์ ์ธ์์ ์ฐ๊ฒฐํฉ๋๋ค. (๊ด์ต์ ์ผ๋ก onSelect)
3. onSelect๋ ์์ ์ปดํฌ๋ํธ์ ์์ฑ์ผ๋ก์ ์ฐ๊ฒฐ๋๊ณ ํด๋น ํจ์๋ฅผ trigger ํฉ๋๋ค.
๐ก TIP
์์ ์ปดํฌ๋ํธ์ ํจ์์์ ์ธ์๋ฅผ ํ์๋ก ํ ๋ ์ธ ์ ์๋ ํธ๋ฆญ(?)์ด ์์ต๋๋ค. ๋ฐ๋ก
prop={ ( ) => handleProp(argument) }์ ๊ฐ์ด ์ต๋ช ํจ์๋ฅผ ์ฐ๋ฉด ๋ฉ๋๋ค.
์ต๋ช ํจ์์ ์ฌ์ฉ ์์ด ๊ทธ๋ฅ prop= { handleProp(argument) } ์ ํํ๋ก ์ฌ์ฉํ๋ฉด, ์ต์ด ๋ ๋ ์ฆ์ ํจ์๊ฐ ์คํ๋๋ ๊ฒ์ด๋ฏ๋ก, ์๋ ์๋์ ๋ฌ๋ผ์ง๋๋ค.
โ
export default function ListButton({ children, ...props }) {
return (
<li>
<button {...props}>
{children}
</button>
</li>
);
}
wrapper ์ปดํฌ๋ํธ ์์ฑ ์ ์ข ๋ ์ ์ฐํ๊ฒ ์ธ์๋ฅผ ๋ฐ์ ์ ์๋ ์คํฌ๋ก {...props} ๊ฐ ์์ต๋๋ค.
{...props}๋ก ๋๋จธ์ง ์ธ์๋ฅผ ๋ชจ๋ ๊ฐ์ฒด๋ก ํฉ๋ณํด ์ ๋ฌ๋ฐ๊ณ , spread operator๋ก์์ {...props}๋ฅผ ๋นํธ์ธ ๊ฐ์ฒด์ ๋ฌ์์ฃผ๋ฉด
onSelect๋ฅผ ๋ฐ๋ก ์ค์ ํ๋ ๋ฑ์ ๊ท์ฐฎ์ props ๋์ง๋์ง๋ฅผ ๊ตณ์ด ์ ์ ์ด๋ ๋์ด ํธํฉ๋๋ค๐
๐จ ์กฐ๊ฑด์ ์ปจํ ์ธ ๋ ๋๋ง์ 3๊ฐ์ง ๋ฐฉ๋ฒ
๊ฐ๋ ์ฑ ๋ฐ ํจ์จ์ฑ ์ธก๋ฉด์ ๊ณ ๋ คํ๋ฉฐ ์ ์ ํ ์กฐ๊ฑด ์ฒ๋ฆฌ๋ฅผ ํ ์ ์์ต๋๋ค.
1. ์ค๊ดํธ ์์ ์ผํญ์ฐ์ฐ์๋ฅผ ์ด์ฉ => ์ฝ๋๊ฐ ๊ฐ๊ฒฐํ๊ณ ์กฐ๊ฑด์ด ๋ ๊ฐ ์ด์์ผ ๋
{isActive ? "active" : ""}
2. ์ค๊ดํธ ์์ && ์ฐ์ฐ์ ์ด์ฉ => ์ฝ๋๊ฐ ๊ฐ๊ฒฐํ๊ณ ์กฐ๊ฑด์ด ํ๋๋ง ์์ ๋
{isActive && "active"}
3. ๋ณ์๋ฅผ ๋ง๋ค๊ณ if ์กฐ๊ฑด๋ฌธ์ผ๋ก ์ฒ๋ฆฌ => ์กฐ๊ฑด์์ด ๋ง์์ ธ ๊ฐ๋
์ฑ์ด ๋จ์ด์ง๋ค๊ณ ์๊ฐ์ด ๋ ๋
export default function HobbyQuestion() {
let content = "<p>What's your Hobby?</p>";
if (selectedContent) {
content = (
<div className="contents">
<h3>Basketball</h3>
<p>it's funny!</p>
</div>
);
}
{/* codes */}
{content}
}
'FE > React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[React] Million JS ๋ ์ด๋ป๊ฒ ์ฑ๋ฅ์ ์ต์ ํ ํ๋๊ฐ? (1) | 2024.04.13 |
---|