ํฐ์คํ ๋ฆฌ ๋ทฐ
[Pokemon PJ_Day 2] ์กฐ๊ฑด๋ถ ์คํ์ผ๋ง, Array.from, ์ด๋ฒคํธ ๋ฒ๋ธ๋ง ๋ฐฉ์ง
์ฑ._. 2025. 2. 5. 00:27'๋ฆฌ์กํธ ์๋ จ์ฃผ์ฐจ ๊ณผ์ : ํฌ์ผ๋ชฌ ๋๊ฐ ๋ง๋ค๊ธฐ' ์งํ ์ค ํด๊ฒฐํ ํธ๋ฌ๋ธ ์ํ
์กฐ๊ฑด๋ถ ์คํ์ผ๋ง(์ผํญ ์ฐ์ฐ์)

(์๋จ ๋ถ๋ถ์ ๋์๋ณด๋(dashboard), ํ๋จ๋ถ๋ถ์ ๋ฆฌ์คํธ(List)๋ก ์ง์นญํ๊ฒ ๋ค.)
๋์๋ณด๋์ ๋ฆฌ์คํธ์ ๋ํ๋๋ ์นด๋ ๋ก์ง์ ๋์ผํ๊ฒ ์์ฑ๋๋ฏ๋ก ๋ฒํผ ๋ถ๋ถ๋ง ๋ฐ๊ฟ์ผ ํ๋ค.
?
if๋ฌธ์ ์ฌ์ฉํด์ผ ํ๋? ๊ฐ์ ์นด๋ ๋ก์ง์ ๋ค๋ฅธ ๋ฐฐ์ด(๋ฆฌ์คํธ๋ ์ ์ฒด ๋ฐ์ดํฐ ๋ฐฐ์ด, ๋์๋ณด๋๋ ํด๋ฆญํ ๋ฐ์ดํฐ ๋ฐฐ์ด)๋ก mapping ํด์ผํ๋?
๋ฒํผ ์กฐ๊ฑด์ ์ด๋ป๊ฒ ์์ฑํ๊ณ ์ ์ฉํด์ผ ํ๋์ง ํท๊ฐ๋ ธ๋ค.
๐์ผํญ์ฐ์ฐ์๋ฅผ ์ด์ฉํ ์กฐ๊ฑด๋ถ ์คํ์ผ๋ง
ํํฐ๋์ ์ค๋ช ์ ์ฐธ๊ณ ํ์ฌ ์กฐ๊ฑด๋ถ ์คํ์ผ๋ง์ ์ ์ฉํ์๋ค.
์ผํญ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํด์ ๋ค์๊ณผ ๊ฐ์ด ๊ตฌํํ๋ค.
(๋ฒํผ ์กฐ๊ฑด) ? (์ถ๊ฐ ๋ฒํผ) : (์ญ์ ๋ฒํผ)
๋ฒํผ ์กฐ๊ฑด์ด ์ฐธ์ผ ์ ์ถ๊ฐ๋ฒํผ, ๊ฑฐ์ง์ผ ์ ์ญ์ ๋ฒํผ์ด๊ธฐ ๋๋ฌธ์
๋ฆฌ์คํธ์ ์์ ๋๋ฅผ ์ฐธ, ๋์๋ณด๋์ ์์ ๋๋ฅผ ๊ฑฐ์ง์ผ๋ก ์ง์ ํ์๋ค.
[PokemonList ํ์ผ]
// PokemonList.jsx
{MOCK_DATA.map((data) => {
return (
<PokemonCard
key={data.id}
addMypokeMon={addMypokeMon}
deleteMypokeMon={deleteMypokeMon}
isAdd={true} // ๋ฆฌ์คํธ์ ์์ ๋ ์ฐธ
data={data}
/>
);
})}
[Dashboard ํ์ผ]
// Dashboard.jsx
{myMon.slice(0, 6).map((mon, index) => {
return (
<PokemonCard
key={index}
data={mon}
isAdd={false} // ๋์๋ณด๋์ ์์ ๋ ๊ฑฐ์ง
/>
);
})}
[PokemonCard ํ์ผ]
// PokemonCard.jsx
{isAdd === true ? (
<AddBtn
className="add-card-btn"
onClick={() => {
addMypokeMon(data.id);
}}
>
์ถ๊ฐ
</AddBtn>
) : (
<DeleteBtn
className="remove-card-btn"
onClick={() => {
deleteMypokeMon(data.id);
}}
>
์ญ์
</DeleteBtn>
)}
Array.from
Dashboard์ ์ ํํ์ง ์์ ๋ถ๋ถ์ 6๊ฐ์ ๋น ํฌ์ผ๋ชฌ ๋ณผ์ ๋๊ณ , ์นด๋๊ฐ ์ถ๊ฐ๋ ๋๋ง๋ค ํ๋์ฉ ์ฑ์์ง๋ ํํ๋ฅผ ๊ตฌํํด์ผ ํ๋ค.


์ฒ์์๋ css๋ฅผ ์ํด ํ๋์ฝ๋ฉ์ผ๋ก ์ด๋ฏธ์ง 6๊ฐ๋ฅผ ๋ฃ์์ง๋ง,
์ด์ ๊ฒฝํ์ ๋ฐํ์ผ๋ก ํ ๊ฐ์ ์ด๋ฏธ์ง ํ์ผ์ map ํด์ผ ํ๋ค๋ ์๊ฐ์ด ๋ค์๋ค.
ํ์ง๋ง ๋ง์ ์ฝ๋๋ก ์ฎ๊ธฐ๋ ค๋ ์๋์ ๊ฐ์ ์๋ฌธ์ผ๋ก ๋จธ๋ฆฌ ์์ด ๊ฐ๋ํ๋ค.
[List ์์ ํด๋ฆญ๋ ์นด๋(filterMon)๋ฅผ PockmonCard๋ก ์ถ๋ ฅํ์ฌ BallSt ๋์ฒดํ๊ธฐ]
?? filterMon์ ๋ฐฐ์ด. PokemonCard์ ๋ณ๊ฐ๋ก ์นด๋ ๋ง๋ค๊ธฐ..?
?? PokemonCard๋ฅผ ์ด๋ป๊ฒ dash์ ์ถ๋ ฅ?
?? ์ถ๋ ฅํ ํ BallSt๋ฅผ ๋์ฒดํ๊ธฐ
์ด ์ค ๋ง์ง๋ง ์๋ฌธ์ด์๋ BallSt(๋น ํฌ์ผ๋ชฌ ๋ณผ)์ ๋์ฒดํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์ ๋ฆฌํ๊ฒ ๋ค.
๋ฐ๋ก Array.from์ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค.
๐Array.from
Array.from์ ๋ฌธ์์ด ๋ฑ ์ ์ฌ ๋ฐฐ์ด(Array-like) ๊ฐ์ฒด๋ ์ดํฐ๋ฌ๋ธํ ๊ฐ์ฒด๋ฅผ ๋ฐฐ์ด๋ก ๋ง๋ค์ด์ฃผ๋ ๋ฉ์๋์ด๋ค.
(โป ์ ์ฌ ๋ฐฐ์ด ๊ฐ์ฒด๋, ํค๊ฐ ์ธ๋ฑ์ค ๊ฐ์ผ๋ก ๋์ด์๊ณ ๊ธธ์ด๋ฅผ ๋ํ๋ด๋ length ์์ฑ์ ๊ฐ๋ ๊ฐ์ฒด๋ฅผ ์๋ฏธํ๋ค.)
// 1. ๋ฌธ์์ด์ ๋ฐฐ์ด๋ก ๋ง๋๋ ์์
console.log(Array.from("Hello"));
// [ 'H', 'e', 'l', 'l', 'o' ]
// 2. ์ ์ฌ ๋ฐฐ์ด ๊ฐ์ฒด๋ฅผ ๋ฐฐ์ด๋ก ๋ง๋๋ ์์
console.log(Array.from({ 0: "์ฐฌ๋ฏผ", 1: "ํฌ์ง", 2: "ํ์ธ", length: 3 }));
// [ '์ฐฌ๋ฏผ', 'ํฌ์ง', 'ํ์ธ' ]
// 3. ํจ์์ ๋งค๊ฐ๋ณ์๋ค์ ์์๋๋ก ๋ฐฐ์ด๋ก ๋ง๋๋ ์์
const funcA = (...arguments) => {
return Array.from(arguments)
}
console.log(funcA(1,2,3,4,5));
// [ 1, 2, 3, 4, 5 ]
์ฒซ ๋ฒ์งธ ์ธ์๋ ๋ฐฐ์ด๋ก ๋ง๋ค ์ดํฐ๋ฌ๋ธํ ๊ฐ์ฒด๊ฐ ๋๋ฉฐ,
๋ ๋ฒ์งธ ์ธ์๋ ์์ฑํ ๋ฐฐ์ด์ ๋ชจ๋ ์์์ ๋ํด ์ํํ ๋งตํ ํจ์์ด๋ค. (์ฝ๋ฐฑํจ์๋ฅผ ์ ๋ฌํ๋ฉด ๋ง์น map ๋ฉ์๋์ ๊ฐ์ ๋์์ ํ๋ค.)
์ ์ฉํ ๋ก์ง์ ๋ค์๊ณผ ๊ฐ๋ค.
// 6-(myMon ๊ฐ์)
const emptyCards = 6 - myMon.length;
{Array.from({ length: emptyCards }).map((_, index) => (
<BallSt
key={index}
src="https://upload.wikimedia.org/wikipedia/commons/thumb/5/51/Pokebola-pokeball-png-0.png/800px-Pokebola-pokeball-png-0.png"
/>
))}
</Balls>
</Header>
);
};
์ฝ๋ ํด์
- {Array.from({ length: emptyCards }) : length๋งํผ ์์๊ฐ undefined์ธ ๋น ๋ฐฐ์ด์ ์์ฑํ๋ค.
- .map((_, index) => (html ์์) : Array.from์ ํตํด ๋ฐํ๋ ๋ฐฐ์ด์ index(์์ ๊ฐ์)๋งํผ html ์์๋ฅผ mapํ ๋ฐฐ์ด๋ก ๋ฐํํ๋ค.

Array.from์ ํตํด ๋น ๋ฐฐ์ด์ ์์ฑํ๊ธฐ ๋๋ฌธ์ ์ด์ ๊ฐ์ด ํด๋ฆญํ ์นด๋์ ๋ถ๋ถ์ด ์ฌ๋ผ์ง๋ ๊ฒ์ด ์๋,
๋ค ์ชฝ๋ถํฐ ๋น ํฌ์ผ๋ชฌ ๋ณผ์ด ๋ํ๋๋ ๊ฒ์ ๊ตฌํํ ์ ์๋ค.
์ด๋ฒคํธ ๋ฒ๋ธ๋ง ๋ฐฉ์ง
๋ชจ๋ ์นด๋๋ ๋ฒํผ์ ์ ์ธํ ๋ถ๋ถ์ ํด๋ฆญํ๋ฉด Detail ํ์ด์ง๋ก ๋์ด๊ฐ๋ ๊ธฐ๋ฅ์ ๊ตฌํํด์ผ ํ๋ค.
์ด์ ์ํ ํ์ด์ง ๊ณผ์ ์๋ 'closest'๋ฅผ ํ์ฉํ์ฌ ๋ถ๋ชจ ์์์ class๋ฅผ ๋ฐ๋ผ ๊ฐ์ง๋ง,
์ด๋ฒ์๋ onClick ์ด๋ฒคํธ๋ฅผ ์นด๋ ์ ์ฒด์ ์ฃผ์ด์ผ ํ๋ค. (Detail๋ก ๋์ด๊ฐ๋ ๊ฒ์ navigate๋ฅผ ์ฌ์ฉํ์ฌ ์ค๋ช ์๋ต)
์ฌ๊ธฐ์ ๋ฌธ์ ๊ฐ ๋๋ ๊ฒ์ด '์ด๋ฒคํธ ๋ฒ๋ธ๋ง'์ธ๋ฐ ๋ค๋ฅธ ๊ณณ๊น์ง ํด๋ฆญ ์ด๋ฒคํธ๊ฐ ํผ์ง์ง ์๋๋ก ์นด๋ ๋ด์์๋ง ํ์ ์ง์ด์ผ ํ๋ค.
์ฌ์ค ๋๋ ๊ทธ์ ๊น์ง ์ด๋ฒคํธ ๋ฒ๋ธ๋ง์ด๋, ํด๋ฆญ์ ํตํด ์๋๋๋ ๊ธฐ๋ฅ์ด ๋ค๋ฅธ ์์๋ก ํผ์ง๋ ๊ฒ์ผ๋ก ์๊ฐํ์๋ค.
ํ์ง๋ง 'ํด๋ฆญ' ์์ฒด์ ๋ํ ๋์์ด ๋ค๋ฅธ ๊ณณ๊น์ง ํผ์ง๋ ๊ฒ์ ์๋ฏธํ๋ค๋ ๊ฑธ ์ด๋ฒ ๊ธฐํ์ ์๊ฒ ๋์๋ค.
์ด๋ฒคํธ ๋ฒ๋ธ๋ง ๋ฐฉ์ง๋ก ๋ํ์ ์ธ(?) ๋ฐฉ๋ฒ์ event.stopPropagation()์ด ์๋ค. ๋ง ๊ทธ๋๋ก propagation(์ ํ)๋ฅผ stopํ๋ ๊ฒ์ด๋ค.
ํ์ง๋ง ์ด ๋ฐฉ์์ ์ถํ์ ๋ก์ง์ด ๊ธธ์ด์ก์ ๋ ์ด๋ฒคํธ๊ฐ ์ด๋์์ ์ค๋จ๋์๋์ง ์ ํํ ์๊ธฐ๊ฐ ์ด๋ ค์์ง๋ค๊ณ ํ๋ค.
๋ฐ๋ผ์ ๋๋ ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ์์ ์ฌ์ฉํ๋ค.
onClick={(e) => {
if (
e.target.classList.contains("add-card-btn") ||
e.target.classList.contains("remove-card-btn")
) {
return;
}
<AddBtn className="add-card-btn">์ถ๊ฐ</AddBtn>
<DeleteBtn className="remove-card-btn">์ญ์ </DeleteBtn>
์ฝ๋ ํด์
- e.target.classList : onClick ์ด๋ฒคํธ์์ className์ ์ธ์
- contains : className์ ๊ฐ๊ณ ์์ผ๋ฉด
- return : ํด๋ฆญ์ด๋ฒคํธ๋ฅผ early return ํ๋ค.
'Forntend > Trouble Shooting' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| vercel ๋ฐฐํฌ ์ค๋ฅ - ์๋ก๊ณ ์นจ 404: NON_FOUND (0) | 2025.02.09 |
|---|---|
| [Pokemon PJ_Day 3]Dynamic Route์ QueryString (0) | 2025.02.06 |
| [movie PJ_day2] DOM์ ํ์ฉํ ๋ฐ๋๋ผ ์ฝ๋ฉ๐ฆ (0) | 2025.01.24 |
| [โ๏ธ] ๋ฆฌ์กํธ live server ์ฐ๊ฒฐํ๋ ๋ฒ (0) | 2025.01.21 |
| Live Server ์ค๋ฅ ๋ฐ ํด๊ฒฐ๋ฐฉ๋ฒ - vscode ์ด๊ธฐํ(๋ ๋ฌด์์) (0) | 2025.01.19 |