React-dnd: ์žกํžˆ์ง€ ์•Š์€ ์˜ค๋ฅ˜: ๋ถˆ๋ณ€ ์œ„๋ฐ˜: ์œ ํšจํ•œ ๋Œ€์ƒ์„ ์ฐพ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2015๋…„ 07์›” 17์ผ  ยท  20์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: react-dnd/react-dnd

์ •๋ ฌ ๊ฐ€๋Šฅํ•œ ๋ชฉ๋ก๊ณผ ํ•ด๋‹น ์ •๋ ฌ ๊ฐ€๋Šฅํ•œ ๋ชฉ๋ก์œผ๋กœ ํ•ญ๋ชฉ์„ ๋Œ์–ด์˜ค๋Š” ๋˜ ๋‹ค๋ฅธ ๋ชฉ๋ก์„ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. ์•ฑ์ด ์˜ˆ์ƒ๋Œ€๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ฒ˜์Œ์— ์ •๋ ฌ ๊ฐ€๋Šฅํ•œ ๋ชฉ๋ก์— ์žˆ๋˜ ํ•ญ๋ชฉ์„ ์ด๋™ํ•˜๋ ค๊ณ  ํ•˜๋ฉด ๋‹ค์Œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

Uncaught Error: Invariant Violation: Expected to find a valid target
.n @ app.js:50803
t.canDropOnTarget @ app.js:50804
(anonymous function) @ app.js:50804
t.handleTopDragEnter @ app.js:50804

์ฝ”๋“œ๊ฐ€ ์•ˆ์ •์ ์œผ๋กœ ์ž‘๋™ํ•˜๊ณ  ์ถ•์†Œ๋œ ๋ฒ„์ „ dist/ReactDnD.min.js ๋งŒ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋””์„œ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์•ผ ํ• ์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

์–ด๋–ค ํžŒํŠธ๋ผ๋„? ์ด ์˜ค๋ฅ˜๋ฅผ ์ผ์œผํ‚ค๋Š” ์ผ๋ฐ˜์ ์ธ ์›์ธ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

๋ˆ„๊ตฐ๊ฐ€๊ฐ€์ด ์˜ค๋ฅ˜์™€ ๋ฌธ์ œ๋ฅผ ์šฐ์—ฐํžˆ ๋ฐœ๊ฒฌํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๋Œ€๋น„ํ•˜์—ฌ ์ •๋ ฌ ๊ฐ€๋Šฅํ•œ ๋ชฉ๋ก์„ ์ž‘์„ฑํ•  ๋•Œ ๋น„์Šทํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๊ณ  ๊ฐ ํ•ญ๋ชฉ์—๋Š” ํ•ด๋‹น ID์™€ ๋ชฉ๋ก์˜ ์ƒ‰์ธ ์—ฐ๊ฒฐ๋กœ ๊ตฌ์„ฑ๋œ ํ‚ค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
๋“œ๋ž˜๊ทธ๋˜๋Š” ์š”์†Œ์— ๋Œ€ํ•ด ์ ์ ˆํ•œ(์ฆ‰, ์ผ๊ด€๋œ) ํ‚ค๋ฅผ ์„ค์ •ํ•˜๋ฉด ์ˆ˜์ •์ด ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  20 ๋Œ“๊ธ€

์ฝ”๋“œ๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋„ค, ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ๋ฅผ ์–ด๋”˜๊ฐ€์— ์˜ฌ๋ ค์ฃผ์„ธ์š”.
๋˜ํ•œ ๋งŽ์€ ์‚ฌ์šฉ์ž๊ฐ€ NPM์˜ ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ๋””๋ฒ„๊ทธํ•˜๊ธฐ๊ฐ€ ๋” ์‰ฌ์šธ ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ๋ถ„์„ ์œ„ํ•ด ์˜ˆ์ œ๋ฅผ ์„ค์ •ํ•˜๋Š” ๋™์•ˆ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. beginDrag ๋ฐ˜ํ™˜๋œ ๊ฐœ์ฒด์— ID๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ React์—๋Š” ์ด์— ๋Œ€ํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๊ณ , ์ด๋กœ ์ธํ•ด React-Dnd์—์„œ ํ•ด๋‹น ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํฅ๋ฏธ๋กญ๋„ค์š”. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! beginDrag() ๊ฐ€ ์ผ๋ฐ˜ ๊ฐœ์ฒด์ธ ํ•œ ๋ฐ˜ํ™˜๋˜๋Š” ํ•ญ๋ชฉ์— ๋Œ€ํ•ด ์‹ค์ œ๋กœ ์ œํ•œ์„ ๋‘์ง€ ์•Š์œผ๋ฏ€๋กœ ์˜ค๋ฅ˜ ํ๋ฆ„์ด ๋ฌด์—‡์ธ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

์˜ค๋ž˜๋œ ์Šค๋ ˆ๋“œ์— ์ถ”๊ฐ€ํ•ด์„œ ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๊ฒƒ์ด ์ธํ„ฐ๋„ท ์ „์ฒด์—์„œ ์ด ์˜ค๋ฅ˜์— ๋Œ€ํ•œ ์œ ์ผํ•œ ์ฐธ์กฐ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๋ฏธ๋ž˜์— ๋‹ค์Œ์„ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

๋™์ผํ•œ ์˜ค๋ฅ˜๊ฐ€ ์žˆ์—ˆ์ง€๋งŒ ๋ฌธ์ œ๋Š” _๋‘˜ ๋‹ค_ ๋“œ๋ž˜๊ทธ ์•ค ๋“œ๋กญ ๋ž˜ํผ๋กœ ์žฅ์‹๋œ ๊ตฌ์„ฑ ์š”์†Œ(์˜ˆ์ œ์—์„œ Card์™€ ์œ ์‚ฌ)๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

simulateBeginDrag ์‹œ์ž‘๋˜์—ˆ์„ ๋•Œ _drop target_(๋“œ๋ž˜๊ทธ ์†Œ์Šค ๋Œ€์‹ )์„ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๊ธฐ๋กœ ๋ณด๋ƒˆ์ง€๋งŒ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•ด๊ฒฐ์ฑ…์€ ํ•ธ๋“ค๋Ÿฌ ID๋ฅผ ๊ฐ€์ ธ์˜ฌ ๋•Œ ํ•œ ์ˆ˜์ค€ ๊นŠ์ด( getDecoratedComponentInstance() )์˜€์Šต๋‹ˆ๋‹ค.

@yannisbarlas ํ›Œ๋ฅญํ•œ ๋ฐœ๊ฒฌ. ๋‚˜๋Š” ๋˜‘๊ฐ™์€ ๋ฌธ์ œ์— ๋ถ€๋”ช์ณค๋‹ค. ํ…Œ์ŠคํŠธ ๋ฌธ์„œ ์—์„œ ์ด์— ๋Œ€ํ•œ ์–ธ๊ธ‰์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@yannisbarlas ์ฐพ์•„ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ๋งŽ์€ ์ขŒ์ ˆ์— ํฐ ๋„์›€์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค :)

๋ˆ„๊ตฐ๊ฐ€๊ฐ€์ด ์˜ค๋ฅ˜์™€ ๋ฌธ์ œ๋ฅผ ์šฐ์—ฐํžˆ ๋ฐœ๊ฒฌํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๋Œ€๋น„ํ•˜์—ฌ ์ •๋ ฌ ๊ฐ€๋Šฅํ•œ ๋ชฉ๋ก์„ ์ž‘์„ฑํ•  ๋•Œ ๋น„์Šทํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๊ณ  ๊ฐ ํ•ญ๋ชฉ์—๋Š” ํ•ด๋‹น ID์™€ ๋ชฉ๋ก์˜ ์ƒ‰์ธ ์—ฐ๊ฒฐ๋กœ ๊ตฌ์„ฑ๋œ ํ‚ค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
๋“œ๋ž˜๊ทธ๋˜๋Š” ์š”์†Œ์— ๋Œ€ํ•ด ์ ์ ˆํ•œ(์ฆ‰, ์ผ๊ด€๋œ) ํ‚ค๋ฅผ ์„ค์ •ํ•˜๋ฉด ์ˆ˜์ •์ด ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

@yannisbarlas ์†”๋ฃจ์…˜์˜ ์ฝ”๋“œ ์˜ˆ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

@damiangreen ๋‹ต๋ณ€์ด ๋Šฆ์–ด ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ์•Œ๋ฆผ ์ด๋ฉ”์ผ์ด ์ €๋ฅผ ์ง€๋‚˜์ณ ๋‚ ์•„๊ฐ”์Šต๋‹ˆ๋‹ค.

์ฝ”๋“œ๋Š” ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š์ง€๋งŒ(์˜ค๋žœ ์‹œ๊ฐ„์ด ์ง€๋‚ฌ์Œ) ์—ฌ๊ธฐ์—์„œ ํ™•์ธํ•  ์ˆ˜

๋ˆ„๊ตฐ๊ฐ€ ์ด ๋ฌธ์ œ์—์„œ ๊ณ„์† ์‹คํ–‰๋˜๋Š” ๊ฒฝ์šฐ ๋งคํ•‘ํ•˜๋Š” ๋ชฉ๋ก์˜ ์š”์†Œ์— ์˜๊ตฌ ํ‚ค ์†Œํ’ˆ์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ œ ๊ฒฝ์šฐ์—๋Š” ๋ชฉ๋ก์˜ ํ•ญ๋ชฉ์„ ๋ณ€๊ฒฝํ•˜๊ธฐ ์œ„ํ•ด Redux ์ž‘์—…์„ ๋””์ŠคํŒจ์น˜ํ•œ ๋‹ค์Œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋งคํ•‘๋œ ์š”์†Œ์— ํ‚ค๋ฅผ ์ œ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค.

blocks.map((block, idx) => {
  <React.Fragment key={`${block.name}_${idx}`}>
    ...
  <React.Fragment />
})

idx ๊ฐ€ ์ฆ‰์„์—์„œ ๋ณ€๊ฒฝ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ถ„๋ช…ํžˆ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

@chulanovskyi ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค
๋‚˜๋ฅผ ์œ„ํ•ด ๊ทธ๊ฒƒ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณด์˜€๋‹ค :
JSX arr.map((item, idx) => ( <Item item={item} // key={`${idx}_${item.id}`} // this was busted because idx key={item.key} // when adding this to the array elsewhere i use a count for uniqueness index={idx} > </Item> ))

๋‚˜์—๊ฒŒ ์ด ์˜ค๋ฅ˜๋Š” ๋™์ ์œผ๋กœ ์ƒ์„ฑ๋œ ๋“œ๋กญ ์˜์—ญ์œผ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰ ํ•ญ๋ชฉ์ด ๋“œ๋กญ ์˜์—ญ์—์„œ ์ด๋™ํ•  ๋•Œ React๋Š” ํ•ด๋‹น ์˜์—ญ ์—†์ด ๋‹ค์‹œ ๋ Œ๋”๋ง๋˜๋ฉฐ ์ด๋กœ ์ธํ•ด ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ฐ™์€ ์•„์ดํ…œ์—์„œ ํŒŒ์ƒ๋œ ๊ทธ๋ฃน์ธ๋ฐ๋„ ์•„์ดํ…œ์„ ์˜ฎ๊ธฐ๊ธฐ ์ง์ „์— ์˜์—ญ์ด ์ œ๊ฑฐ๋˜๋Š” ๊ฒฝํ•ฉ ์ƒํƒœ์ธ๊ฐ€ ํ 

๋‚˜์—๊ฒŒ ์ด ์˜ค๋ฅ˜๋Š” ๋™์ ์œผ๋กœ ์ƒ์„ฑ๋œ ๋“œ๋กญ ์˜์—ญ์œผ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰ ํ•ญ๋ชฉ์ด ๋“œ๋กญ ์˜์—ญ์—์„œ ์ด๋™ํ•  ๋•Œ React๋Š” ํ•ด๋‹น ์˜์—ญ ์—†์ด ๋‹ค์‹œ ๋ Œ๋”๋ง๋˜๋ฉฐ ์ด๋กœ ์ธํ•ด ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ฐ™์€ ์•„์ดํ…œ์—์„œ ํŒŒ์ƒ๋œ ๊ทธ๋ฃน์ธ๋ฐ๋„ ์•„์ดํ…œ์„ ์˜ฎ๊ธฐ๊ธฐ ์ง์ „์— ์˜์—ญ์ด ์ œ๊ฑฐ๋˜๋Š” ๊ฒฝํ•ฉ ์ƒํƒœ์ธ๊ฐ€ ํ 

์•ˆ๋…•ํ•˜์„ธ์š” @DominicTobias
๋˜ํ•œ ๋“œ๋กญ ์˜์—ญ์„ ๋™์ ์œผ๋กœ ์ƒ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.
์–ด๋–ป๊ฒŒ ๊ณ ์ณค์Šต๋‹ˆ๊นŒ?

@raymond-ong

๋˜ํ•œ ๋“œ๋กญ ์˜์—ญ์„ ๋™์ ์œผ๋กœ ์ƒ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.
์–ด๋–ป๊ฒŒ ๊ณ ์ณค์Šต๋‹ˆ๊นŒ?

์ฆ‰, ๋ฌธ์ œ๋Š” ์ƒ์œ„(์ƒ์œ„) ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋‹ค์‹œ ์ƒ์„ฑํ–ˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ๊ฒฝ์šฐ react-dnd๋Š” id(์ž์‹ ์˜ ๋‚ด๋ถ€ id)๋ฅผ ์žƒ์–ด๋ฒ„๋ฆฌ๊ณ  ์ž‘์—…ํ•˜๊ณ  ์˜ค๋ฅ˜๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

์ œ ๊ฒฝ์šฐ์—๋Š” ๋ฆฌ๋“€์„œ์—์„œ ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•  ๋•Œ ์ƒ์œ„ ์—”ํ‹ฐํ‹ฐ์˜ id ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์—…๋ฐ์ดํŠธํ–ˆ์Šต๋‹ˆ๋‹ค(ํ–‰ ๋‚ด์—์„œ ์—ด์„ ์ด๋™ํ•˜๊ณ  ์—ด์ด ์œ„์น˜๋ฅผ ๋ณ€๊ฒฝํ•  ๋•Œ ํ–‰ ID ์—…๋ฐ์ดํŠธ). updating id functionality ์ œ๊ฑฐํ•˜๋ฉด ๋ชจ๋“  ๊ฒƒ์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ž‘๋™ํ•˜๊ธฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋˜ํ•œ์ด ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ œ ๊ฒฝ์šฐ์—๋Š” drop target์ด canDrop์—์„œ false๋ฅผ ๋ฐ˜ํ™˜ํ•  ๋•Œ๋งŒ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋ˆ„๊ตฌ๋“ ์ง€ ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ์†”๋ฃจ์…˜์„ ๊ฒŒ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์•„์ด๋”” ๋ˆ„๋ฝ๊ณผ ๊ด€๋ จ์ด ์žˆ๋‹ค๊ณ  ๋ˆ„๊ตฐ๊ฐ€ ๋ง์”€ํ•˜์…จ๋Š”๋ฐ ์•„์ด๋””๋ฅผ ์–ด๋””์— ๋„ฃ์–ด์•ผ ํ• ์ง€ ๊ฐ์ด ์•ˆ์˜ค๋„ค์š”?

๋‚˜๋Š” ๊ฐ™์€ ๋ฌธ์ œ์— ์ง๋ฉดํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์„œ์—์„œ ์˜ˆ์ œ๋ฅผ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ์š”์†Œ ์ฃผ์œ„๋ฅผ ๋“œ๋ž˜๊ทธ/๋“œ๋กญํ•˜์—ฌ ์—ฌ๊ธฐ์—์„œ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. https://codesandbox.io/s/broken-feather-qf0f2?file= /src/Container.jsx

๋‚˜๋Š” ๋˜ํ•œ ๋ชจ๋“  ์„ธ๋ถ€ ์‚ฌํ•ญ์— ๋Œ€ํ•œ ๋ฌธ์ œ๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค(์•„๋งˆ ๋‚ด๊ฐ€ ์—ฌ๊ธฐ์— ๋ฐฉ๊ธˆ ๊ฒŒ์‹œํ–ˆ์–ด์•ผ ํ–ˆ๋‚˜?)

๋‚˜๋Š” ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‚ด ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์•˜์Šต๋‹ˆ๋‹ค.

const ParentOfCards = () => {    

     const [ cards, setCards ] = useState([ ... ])

    const CardComponent = ({ card, index }) => {
       return (/**/)
    }
    return (
        <div>
            { cards.map( CardComponent ) }
        </div>
    )

}

์ด ๋„ฃ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค ๋‹น์‹  ๋ฐํ˜€ CardComponent ๋‚ด๋ถ€ ParentOfCards (๋‚˜๋Š”-๋ Œ๋”๋ง ๋‹ค์‹œ๋Š” ํ•จ๊ป˜ ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐ), ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๋ถ„๋ฆฌ ํ•ด๊ฒฐ ๊ทธ๋ž˜์„œ CardComponent ๋กœ๋ถ€ํ„ฐ ParentOfCards ๋ฒ”์œ„:

const ParentOfCards = () => {    

     const [ cards, setCards ] = useState([ ... ])


    return (
        <div>
            { cards.map( CardComponent ) }
        </div>
    )

}

const CardComponent = ({ card, index }) => {
       return (/**/)
}

๊ทธ๋ฆฌ๊ณ  ์ด์ œ (๋””๋ฒ„๊น… ์ดํ‹€ ํ›„ :c) ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค! ๐Ÿ˜

@marcelomrtnz ์ •๋ง ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค
๋ชจ๋ฐ”์ผ์—์„œ ์ด ๋ฌธ์ œ์— ๋Œ€ํ•ด ๋งŽ์€ ์‹œ๊ฐ„์„ ์ ˆ์•ฝํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ฐ˜์‘ dnd lib๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋ฐ”์ผ์—์„œ ๋“œ๋ž˜๊ทธ ๋“œ๋กญํ•˜๋Š” ๋™์•ˆ ๋™์ผํ•œ ๋ฌธ์ œ์— ์ง๋ฉดํ–ˆ์ง€๋งŒ ๋ชฉ๋ก์—์„œ ํ–‰ ์—ด div๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ์นด๋“œ ๋ชฉ๋ก๋งŒ ์œ ์ง€ํ•œ ํ›„์—๋Š” ์ด ์˜ค๋ฅ˜ ์—†์ด ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋ฐ”์ผ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์œ ํšจํ•œ ๋Œ€์ƒ์„ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‹น์‹ ์˜ ๊ฒŒ์‹œ๋ฌผ์—์„œ์ด ์•„์ด๋””์–ด๋ฅผ ์–ป์—ˆ์œผ๋ฏ€๋กœ @marcelomrtnz ์—๊ฒŒ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. https://codesandbox.io/s/proud-wind-hklt6?file=/src/CreateForum.jsx
๋‹ค์Œ์€ ์ƒŒ๋“œ๋ฐ•์Šค์ž…๋‹ˆ๋‹ค. ํ•ญ๋ชฉ 1ba๋ฅผ ํ•ญ๋ชฉ 1 ์œ„๋กœ ๋“œ๋ž˜๊ทธํ•œ ๋‹ค์Œ ํ•ญ๋ชฉ 1ba๋ฅผ ๋‹ค์‹œ ์•„๋ž˜๋กœ ๋•๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰