ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

'๋ฆฌ์•กํŠธ ์ˆ™๋ จ์ฃผ์ฐจ ๊ณผ์ œ : ํฌ์ผ“๋ชฌ ๋„๊ฐ ๋งŒ๋“ค๊ธฐ' ์ง„ํ–‰ ์ค‘ ํ•ด๊ฒฐํ•œ ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ…


์กฐ๊ฑด๋ถ€ ์Šคํƒ€์ผ๋ง(์‚ผํ•ญ ์—ฐ์‚ฐ์ž)

 

(์ƒ๋‹จ ๋ถ€๋ถ„์„ ๋Œ€์‹œ๋ณด๋“œ(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 ํ•œ๋‹ค.
๊ณต์ง€์‚ฌํ•ญ
์ตœ๊ทผ์— ์˜ฌ๋ผ์˜จ ๊ธ€
์ตœ๊ทผ์— ๋‹ฌ๋ฆฐ ๋Œ“๊ธ€
Total
Today
Yesterday
๋งํฌ
TAG
more
ยซ   2026/03   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
๊ธ€ ๋ณด๊ด€ํ•จ