<p>react-dnd๊ฐ€ ๋“œ๋ž˜๊ทธ / ๋“œ๋กญ ์—…๋กœ๋“œ๋ฅผ ๋ฐฉํ•ดํ•ฉ๋‹ˆ๋‹ค.</p>

์— ๋งŒ๋“  2016๋…„ 05์›” 12์ผ  ยท  26์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: react-dnd/react-dnd

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

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

์ด๊ฒƒ์ด ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค : https://github.com/react-dnd/react-dnd-html5-backend/blob/85fc956c58a5d1a9fde2fca3c7fca9115a7c87df/src/HTML5Backend.js#L452

์ฝ”๋“œ์˜ ์ฃผ์„ "Do n't show a nice cursor"์— ๋”ฐ๋ฅด๋ฉด e.dataTransfer.dropEffect ๋ฅผ ํ‘œ์‹œ ์†์„ฑ์œผ๋กœ ๋งŒ ์ทจ๊ธ‰ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ dropEffect๋ฅผ none ์‹ค์ œ๋กœ ํŒŒ์ผ์ด ๋ชจ๋‘ ํ•จ๊ป˜ ์‚ญ์ œ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. move , copy ๋˜๋Š” link ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ Chrome 55.0.2์— ์žˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์‹ค์ œ๋กœ react-dnd ์™ธ๋ถ€์—์„œ ์ด๊ฒƒ์„ ๋ชจ๋‘ ํ•จ๊ป˜ ๋ณต์ œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ๋ฐ”์ด์˜ฌ๋ฆฐ์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค : https://jsfiddle.net/ypr6os00/8/

dropEffect์— ๋Œ€ํ•œ effectAllowed ๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๋ฐ˜๋ฉด dropEffect ๋Š” ํ”„๋ฆฌ์   ํ…Œ์ด์…˜

ํŽธ์ง‘ : ์ด๊ฒƒ์€ https://github.com/gaearon/react-dnd-html5-backend/issues/25 ์™€ ๋™์ผํ•œ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

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

๋‚˜๋Š” ๋ฐ˜๋Œ€์˜ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋‹ค. HTML5 ๋ฐฑ์—”๋“œ๊ฐ€ dropzone์—์„œ ์ž‘๋™ํ•˜๋„๋กํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

beginDrag(props) {
  Dropzone.instances[0].disable() 

๊ณผ

endDrag(props, monitor, component) {
  Dropzone.instances[0].enable()

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

๋˜ํ•œ ๋“œ๋ž˜๊ทธ ๊ฐ€๋Šฅํ•œ ํ•ญ๋ชฉ์— <input> ์ด ์žˆ๊ณ  ์‚ฌ์šฉ์ž๊ฐ€ ํ•ญ๋ชฉ์„ ์„ ํƒ / ๋“œ๋ž˜๊ทธํ•˜๋ฉด ํ•ญ๋ชฉ์„ ๋“œ๋ž˜๊ทธํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์ž…๋ ฅ์— ์ดˆ์ ์ด ๋งž์ถฐ์ ธ ์žˆ์œผ๋ฉด canDrag ์—์„œ false ๋ฅผ ๋ฐ˜ํ™˜ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

HTML ๋“œ๋ž˜๊ทธ / ๋“œ๋กญ ์—…๋กœ๋“œ ๋ฐฉํ•ด๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ „์ฒด ๋ ˆ์ด์•„์›ƒ์—์„œ ์ด๋ฏธ ํ™œ์„ฑํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค. @gaearon , ์ƒ๊ฐ?

@ffxsam ์ด๊ฒƒ์ด ์—ฌ์ „ํžˆ ๋ฌธ์ œ์ž…๋‹ˆ๊นŒ?

๋ชจ๋ฅด๊ฒ ์–ด์š”. ์ด ๋ฌธ์ œ๋กœ ์ธํ•ด ์ œ๊ฑฐํ•ด์•ผํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ์ „ํžˆ ๋ฌธ์ œ์ธ์ง€ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค! ์›ํ•˜๋Š” ๊ฒฝ์šฐ์ด ๋ฌธ์ œ๋ฅผ ๋‹ซ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”, ์ €๋Š” ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ๋งˆ์ฃผ ์ณค์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๋ฅผ ์—ด๋ ค๊ณ ํ–ˆ์ง€๋งŒ ์ด๋ฏธ ์—ด๋ ค์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ ReactDnD๋ฅผ ์ธ์Šคํ„ด์Šคํ™” ํ•  ๋•Œ๋งˆ๋‹ค ๋„ค์ดํ‹ฐ๋ธŒ onDrop ์ด๋ฒคํŠธ๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๋‚˜๋Š” ๋™์ผํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ, ์ „์ฒด ๋ณธ๋ฌธ์€ ํ•ญ์ƒ ๋“œ๋ž˜๊ทธ๋˜๋Š” ํŒŒ์ผ์„ ์ˆ˜์‹ ํ•˜๋Š” 'dropzone'์ž…๋‹ˆ๋‹ค. ๋งค์šฐ ๊ฐ„๋‹จํ•œ ๊ธฐ๋Šฅ์ด๋ฉฐ ์ƒ์ž์—์„œ ๋‚˜์˜ค๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ์ด๋ฒคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ทฐ์—์„œ ReactDnD๊ฐ€ ์ž‘๋™ํ•˜๊ณ  ๋“œ๋กญ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์œผ๋ฉฐ onDragEnter ๋˜๋Š” onDragStart ์ด๋ฒคํŠธ๋ฅผ ๋ฎ์–ด ์“ฐ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์žฌ๋ฏธ ์žˆ์Šต๋‹ˆ๋‹ค.
@kesne @gaearon ์–ด๋–ค ๋‹จ์„œ? ReactDnD๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ์‹ถ์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. React์— ๋Œ€ํ•œ ์ตœ๊ณ ์˜ ๋“œ๋ž˜๊ทธ ์•ค ๋“œ๋กญ ์ข…์†์„ฑ์ž…๋‹ˆ๋‹ค.

@kesne @gaearon @xavibonell ๊ณผ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒ ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ Wordpress์™€ ํ•จ๊ป˜ React DND๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ wordpress ๋ฏธ๋””์–ด ์—… ๋กœ๋”๋Š” ํŒŒ์ผ ์—…๋กœ๋“œ์— ๊ธฐ๋ณธ ๋“œ๋กญ ์ด๋ฒคํŠธ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. onDrop ์ฝœ๋ฐฑ์€ ์•ฑ์—์„œ ReactDND๊ฐ€ ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Reactdnd ๋“œ๋กญ ๋Œ€์ƒ์„ ์ œ๊ฑฐํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ํ”„๋กœ์ ํŠธ์— ๋ช‡ ๋‹ฌ์„ ๋ณด๋ƒˆ๊ณ  reactdnd๋Š” ๊ทธ๊ฒƒ์˜ ํ•ต์‹ฌ ๋ถ€๋ถ„์ด๋ฉฐ ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ์‚ฌ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ์‹œ์ ์—์„œ ๋‚˜๋Š” ๋ถ„๋ช…ํžˆ ๋‹ค๋ฅธ ๋„์„œ๊ด€์œผ๋กœ ์ด๋™ํ•  ์—ฌ์œ ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ด ์Šค๋ ˆ๋“œ์™€ Stack Overflow์˜ ์œ ์‚ฌํ•œ ๋ณด๊ณ ์„œ์—์„œ์ด ๋ฌธ์ œ๊ฐ€ ๊ฝค ์˜ค๋žซ๋™์•ˆ ์กด์žฌํ–ˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์— ๋Œ€ํ•œ ๋ชจ๋“  ํ•ด๊ฒฐ์ฑ…์„ ๋งŽ์ด ์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์˜ˆ, ๊ธฐ๋ณธ ์š”์†Œ์™€ ์‚ฌ์šฉ์ž ์ •์˜ dnd ์š”์†Œ๊ฐ„์— ์ž˜๋ชป๋œ ์ƒํ˜ธ ์ž‘์šฉ์ด์žˆ์„ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ๋ฌธ์ œ๋ฅผ ์กฐ์‚ฌ ํ•  ์‹œ๊ฐ„์ด ๋งŽ์ง€ ์•Š์ง€๋งŒ์ด ํ”„๋กœ์ ํŠธ๋ฅผ ์œ„ํ•ด ์‹œ๊ฐ„์„ ํ• ์•  ํ•  ๊ณ„ํš์ด๋ฉฐ ์ด๊ฒƒ์ด ์ œ๊ฐ€ ๊ฐ€์žฅ ๋จผ์ € ์‚ดํŽด ๋ณด๋Š” ๋ฌธ์ œ ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด, ์šฐ๋ฆฌ๊ฐ€ ์ด๊ฒƒ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋‚ผ ์ˆ˜ ์žˆ๋„๋ก ๋ณต์ œ ์˜ˆ์ œ๋กœ ์ตœ์†Œํ•œ์˜ ์ €์žฅ์†Œ ์„ค์ •์„ ์–ป๋Š” ๊ฒƒ์ด ๋งค์šฐ ์œ ์šฉ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@kesne ๊ท€ํ•˜์˜ ๋‹ต๋ณ€์— ๊ฐ์‚ฌ ๊ธฐ์ฉ๋‹ˆ๋‹ค . ๋‚˜๋Š” ํ™•์‹คํžˆ ๋‹น์‹ ์„ ์œ„ํ•ด ๋ผ์ด๋ธŒ ์˜ˆ์ œ๋ฅผ ๋งŒ๋“ค๊ณ  ๋น ๋ฅธ ์‹œ์ผ ๋‚ด์— ์—ฌ๊ธฐ์— ๋งํฌ๋ฅผ ๊ฒŒ์‹œ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๊ทธ ๋™์•ˆ ๋‚˜๋Š” ์ผ์‹œ์ ์ธ ํ•ดํ‚น์„ ์ƒ๊ฐํ•œ ๊ฒƒ ๊ฐ™๊ณ  ์•„์ง ์ฒ ์ €ํžˆ ํ…Œ์ŠคํŠธํ•˜์ง€๋Š” ์•Š์•˜์ง€๋งŒ ์ง€๊ธˆ์€ ํŠธ๋ฆญ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋ฅผ ์ฐฝ ์š”์†Œ์— ๋ฐ”์ธ๋”ฉํ•˜๋Š” HTML5Backend์— setup () ๋ฐ teardown () ํ•จ์ˆ˜๊ฐ€ ์žˆ์Œ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค. ํ•„์ž์˜ ๊ฒฝ์šฐ ์›Œ๋“œ ํ”„๋ ˆ์Šค ํŒŒ์ผ ์—… ๋กœ๋”๋Š” ์ „์ฒด ํ™”๋ฉด์„ ์ฐจ์ง€ํ•˜๋Š” ๋ชจ๋‹ฌ ์ƒ์ž์ด๋ฏ€๋กœ ๋ชจ๋‹ฌ์ด ์—ด๋ ค์žˆ์„ ๋•Œ ReactDND ์š”์†Œ๋ฅผ ๋Œ์–ด์„œ ๋†“์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ชจ๋‹ฌ ์ฐฝ์˜ ์—ด๊ธฐ ์ด๋ฒคํŠธ ์ค‘์— ๋ฐฑ์—”๋“œ์˜ ์ธ์Šคํ„ด์Šค (DragDropManager๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ ๊ฐ€๋Šฅ)์—์„œ teardown () ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ๋ชจ๋‹ฌ์ด ๋‹ซํžˆ๋Š” ๋™์•ˆ setup () ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ž˜ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์ง€๋งŒ ๋ถ„ํ•ด ๋ฐ ์„ค์ • ํ•จ์ˆ˜๋ฅผ ๋‹ค์‹œ ํ˜ธ์ถœํ•˜๋ฉด ๊ธฐ์กด ๋˜๋Š” ์ƒˆ๋กœ ๋ Œ๋”๋ง ๋œ ๊ตฌ์„ฑ ์š”์†Œ์—์„œ ReactDND์— ๋‹ค๋ฅธ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ๋ ค์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

์ด๊ฒƒ์ด ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค : https://github.com/react-dnd/react-dnd-html5-backend/blob/85fc956c58a5d1a9fde2fca3c7fca9115a7c87df/src/HTML5Backend.js#L452

์ฝ”๋“œ์˜ ์ฃผ์„ "Do n't show a nice cursor"์— ๋”ฐ๋ฅด๋ฉด e.dataTransfer.dropEffect ๋ฅผ ํ‘œ์‹œ ์†์„ฑ์œผ๋กœ ๋งŒ ์ทจ๊ธ‰ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ dropEffect๋ฅผ none ์‹ค์ œ๋กœ ํŒŒ์ผ์ด ๋ชจ๋‘ ํ•จ๊ป˜ ์‚ญ์ œ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. move , copy ๋˜๋Š” link ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ Chrome 55.0.2์— ์žˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์‹ค์ œ๋กœ react-dnd ์™ธ๋ถ€์—์„œ ์ด๊ฒƒ์„ ๋ชจ๋‘ ํ•จ๊ป˜ ๋ณต์ œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ๋ฐ”์ด์˜ฌ๋ฆฐ์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค : https://jsfiddle.net/ypr6os00/8/

dropEffect์— ๋Œ€ํ•œ effectAllowed ๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๋ฐ˜๋ฉด dropEffect ๋Š” ํ”„๋ฆฌ์   ํ…Œ์ด์…˜

ํŽธ์ง‘ : ์ด๊ฒƒ์€ https://github.com/gaearon/react-dnd-html5-backend/issues/25 ์™€ ๋™์ผํ•œ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

์ œ ๊ฒฝ์šฐ์—๋Š” e.dataTransfer.dropEffect = 'none'; (https://github.com/react-dnd/react-dnd-html5-backend/blob/85fc956c58a5d1a9fde2fca3c7fca9115a7c87df/src/HTML5Backend.js#L452)๋ฅผ ๊ฐ„๋‹จํžˆ ์ฃผ์„ ์ฒ˜๋ฆฌํ•˜์—ฌ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ) ๋‚ด Dropzone ๋“œ๋กญ ์ด๋ฒคํŠธ๋ฅผ ๋ฐฉํ•ดํ•˜๋Š” react-dnd ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ ๋กœ ๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•œ ์„ค์ •์ด ์žˆ์Šต๋‹ˆ๋‹ค.

<DragDropContextProvider backend={HTML5Backend}>
  <Dropzone>
    <DropTargetComponent />
    <OtherComponent>
      <DragSourceComponent1 />
      <DragSourceComponent2 />
      <DragSourceComponentN />
    </OtherComponent>
  </Dropzone>
</DragDropContextProvider>

DropTargetComponent = DropTarget(TYPE, target, collect)(Component) ๋ฐ DragSourceComponent = DragSource(TYPE, source, collect)(Component) .

์ด ํŒจ์น˜ ๋˜๋Š” ๋” ๋‚˜์€ ์ˆ˜์ •์˜ ์•Œ๋ ค์ง„ ๋ถ€์ž‘์šฉ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ด๊ฒƒ์€ ์˜์›ํžˆ ๋ณ‘ํ•ฉ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋ชจ๋“  ํ›Œ๋ฅญํ•œ ์ž‘์—…์— ๊ฐ์‚ฌ ๋“œ๋ฆฌ๋ฉฐ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ฐพ์•„ ์ฃผ์‹  @ kn0ll ์—๊ฒŒ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

[ํŽธ์ง‘ํ•˜๋‹ค]
๋ˆ„๊ตฌ์—๊ฒŒ๋‚˜ ์œ ์šฉํ•˜๋‹ค๋ฉด ๋ฉ”์ธ ํ”„๋กœ์ ํŠธ์—์„œ์ด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ ๋  ๋•Œ๊นŒ์ง€ Github ํฌํฌ ์™€ npm ํŒจํ‚ค์ง€๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค

์ค‘์ฒฉ ๋œ ๋“œ๋กญ ์กด์— ๋Œ€ํ•ด react-dropzone ์˜ˆ์ œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํšจ๊ณผ์ ์ด๋ผ๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค. ์ „ํŒŒ๋ฅผ ์ค‘์ง€ํ•˜๊ณ  ๋ฌธ์ œ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋Š˜์ด ๋ฌธ์ œ๋ฅผ ๋ฐœ๊ฒฌํ•˜๊ธฐ ์ „๊นŒ์ง€๋Š” ์ด๊ฒƒ์ด ์ œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด์—ˆ์Šต๋‹ˆ๋‹ค.

์ด ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ค‘์ฒฉ ๋œ ๋“œ๋กญ ์กด์— ๋Œ€ํ•œ ์•„์ด๋””์–ด๋ฅผ ๊ฐ์•ˆํ•  ๋•Œ, div ๋‚ด๋ถ€์— what-uploading-component๋ฅผ ๋ž˜ํ•‘ํ•˜๊ณ  ํ•ด๋‹น div์— onDragOver ์†์„ฑ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์ „ํŒŒ๋ฅผ ์ค‘์ง€ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‚ด ๊ฒฝ์šฐ์— ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์˜€์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— ์˜ˆ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค (Filepond๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค).

 handleDragOver (event) {
    console.log('dragged over ', event.dataTransfer)
    event.stopPropagation()
  }

  render () {
    return (
      <div onDragOver={this.handleDragOver}>
        <FilePond />
      </div>
    )
  }

๊ทธ๋Ÿฌ๋‚˜ react-dnd๊ฐ€ ๋‹ค๋ฅธ ๊ตฌ์„ฑ ์š”์†Œ์˜ d & d ๊ธฐ๋Šฅ์„์ด ์ •๋„๋กœ ๋ฐฉํ•ด ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ƒ๊ฐ์€ ๋งˆ์Œ์— ๋“ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค. d & d DOM ๋…ธ๋“œ์— react-dnd๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ผ๋ถ€ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ๋‹ค๋ฅธ ๊ตฌ์„ฑ ์š”์†Œ์—์„œ d & d ํŒŒ์ผ ๋“œ๋กญ ๊ธฐ๋Šฅ์„ ์†์ƒ์‹œํ‚ฌ ์ˆ˜์žˆ๋Š” ํฐ ์‚ฌ๊ณ ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด +1

์•„๋งˆ๋„ ๋ช‡ ๊ฐ€์ง€ ๋น ๋ฅธ ํ•ด๊ฒฐ์ฑ…์€ dropEffect๊ฐ€ ์–ด๋–ค ์†Œํ’ˆ ์ฒด์ธ์„ ํ†ตํ•ด ์–ด๋–ป๊ฒŒ ๋“  ์ง€์ • ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๊ฒฐ๊ตญ HTML5 ๋ฐฑ์—”๋“œ์— @silvainSayduck ํฌํฌ๋ฅผ ์‚ฌ์šฉ

๊ณง์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๊นŒ? @silvainSayduck ์ˆ˜์ •์— ๋Œ€ํ•œ ํ’€ ์š”์ฒญ์„ ์—ด ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚ด ์ €์žฅ์†Œ์—์„œ ํ’€ ์š”์ฒญ์„ ๋งŒ๋“ค์—ˆ์ง€ ๋งŒ ์ด๊ฒƒ์ด ๋งŽ์€ ๋„์›€์ด ๋ ์ง€ ํ™•์‹ ํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค (ํ•œ ์ค„์— ์›์น˜ ์•Š๋Š” ๋ถ€์ž‘์šฉ์ด ์žˆ๋‹ค๋Š” ์ฃผ์„์„ ๋‹ฌ์•˜๋Š”์ง€ ๋˜๋Š” ๋ชจ๋“  ์‚ฌ์šฉ ์‚ฌ๋ก€์—์„œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋”๋ผ๋„ ์—ฌ์ „ํžˆ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค).

1239 ๋…„

@darthtrevino ์ด ํ”„๋กœ์ ํŠธ์˜ ๊ณตํ—Œ์ž๋กœ ์ฐธ์—ฌ

PR์„ ์‚ดํŽด๋ณด๋ฉด ํ•ฉ๋ฆฌ์ ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. ์˜ˆ์ œ์™€ ๊ด€๋ จ์ด ์—†๋Š”์ง€ ํ™•์ธํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

# 1240์— ํ•ฉ๋ณ‘

@darthtrevino ๋งŽ์ด ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! npm ๋ฒ„์ „์—์„œ ์–ธ์ œ ์ถœ์‹œ ๋˜๋‚˜์š”?

ํ•˜๋ฃจ๊ฐ€ ๋๋‚  ๋ฌด๋ ต-์ด ํ”„๋กœ์ ํŠธ์— ์ฐธ์—ฌํ•  ์‹œ๊ฐ„์ด ์ƒ๊ธฐ๋ฉด ์ผ๋ฐ˜์ ์ธ ์ž‘์—… ํ๋ฆ„์€ PR ์ผ๊ด„ ์ž‘์—…์„ ์ˆ˜ํ–‰ ํ•œ ๋‹ค์Œ ๋ฆด๋ฆฌ์Šค๋ฅผ ์ž๋ฅด๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@darthtrevino ํ˜„์žฌ ๋ฆด๋ฆฌ์Šค์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์–ธ์ œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ํ˜„์žฌ ๋ฆด๋ฆฌ์Šค์— ์žˆ๋‹ค๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์•Œ๋ ค์ฃผ์„ธ์š”

@darthtrevino ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค, ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ค‘์ฒฉ ๋œ ๋“œ๋กญ ์กด์— ๋Œ€ํ•œ ์•„์ด๋””์–ด๋ฅผ ๊ฐ์•ˆํ•  ๋•Œ, div ๋‚ด๋ถ€์— what-uploading-component๋ฅผ ๋ž˜ํ•‘ํ•˜๊ณ  ํ•ด๋‹น div์— onDragOver ์†์„ฑ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์ „ํŒŒ๋ฅผ ์ค‘์ง€ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‚ด ๊ฒฝ์šฐ์— ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์˜€์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— ์˜ˆ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค (Filepond๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค).

 handleDragOver (event) {
    console.log('dragged over ', event.dataTransfer)
    event.stopPropagation()
  }

  render () {
    return (
      <div onDragOver={this.handleDragOver}>
        <FilePond />
      </div>
    )
  }

๊ทธ๋Ÿฌ๋‚˜ react-dnd๊ฐ€ ๋‹ค๋ฅธ ๊ตฌ์„ฑ ์š”์†Œ์˜ d & d ๊ธฐ๋Šฅ์„์ด ์ •๋„๋กœ ๋ฐฉํ•ด ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ƒ๊ฐ์€ ๋งˆ์Œ์— ๋“ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค. d & d DOM ๋…ธ๋“œ์— react-dnd๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ผ๋ถ€ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ๋‹ค๋ฅธ ๊ตฌ์„ฑ ์š”์†Œ์—์„œ d & d ํŒŒ์ผ ๋“œ๋กญ ๊ธฐ๋Šฅ์„ ์†์ƒ์‹œํ‚ฌ ์ˆ˜์žˆ๋Š” ํฐ ์‚ฌ๊ณ ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด +1

์•„๋งˆ๋„ ๋ช‡ ๊ฐ€์ง€ ๋น ๋ฅธ ํ•ด๊ฒฐ์ฑ…์€ dropEffect๊ฐ€ ์–ด๋–ค ์†Œํ’ˆ ์ฒด์ธ์„ ํ†ตํ•ด ์–ด๋–ป๊ฒŒ ๋“  ์ง€์ • ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

handleDragOver [Dropzone]์— event.stopPropagation() ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ์ œ ๊ฒฝ์šฐ์— ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค @vileppanen

์ด ์Šค๋ ˆ๋“œ๋Š” ๋‚ด ์ƒ๋ช…์„ ๊ตฌํ–ˆ์Šต๋‹ˆ๋‹ค

<Dropzone /> ์ด react-dnd ๊ตฌ์„ฑ ์š”์†Œ ๋‚ด๋ถ€์—์žˆ๋Š”์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ ๋™์ผํ•œ ์†”๋ฃจ์…˜์ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. <div onDragOver={e=> e.stopPropagation() /> ์—์„œ onDragOver <Dropzone /> ๋ž˜ํ•‘ ์ „ํŒŒ๋ฅผ ์ค‘์ง€ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

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