React-dnd: ์ค‘์ฒฉ ๋œ DragSource์— ๋Œ€ํ•œ ๊ฒฝ๊ณ 

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

DragSource์ด๊ธฐ๋„ ํ•œ ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์— DragSource๊ฐ€์žˆ๋Š” ๊ฒฝ์šฐ (์ฆ‰, ๋“œ๋ž˜๊ทธ ๊ฐ€๋Šฅํ•œ ๋‚ด๋ถ€์—์„œ ๋“œ๋ž˜๊ทธ) ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋“œ๋ž˜๊ทธ ํ•  ๋•Œ๋งˆ๋‹ค ๋‹ค์Œ ๊ฒฝ๊ณ ๊ฐ€ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.

Warning: setState(...): Cannot update during an existing state transition (such as within `render`). Render methods should be a pure function of props and state.
warning @   modules.js?hash=107dc56โ€ฆ:19491
getInternalInstanceReadyForUpdate   @   modules.js?hash=107dc56โ€ฆ:5476
ReactUpdateQueue.enqueueSetState    @   modules.js?hash=107dc56โ€ฆ:5617
ReactComponent.setState @   modules.js?hash=107dc56โ€ฆ:15132
handleChange    @   modules.js?hash=107dc56โ€ฆ:20844
handleChange    @   modules.js?hash=107dc56โ€ฆ:22861
dispatch    @   modules.js?hash=107dc56โ€ฆ:23568
addSource   @   modules.js?hash=107dc56โ€ฆ:23124
registerSource  @   modules.js?hash=107dc56โ€ฆ:21172
receiveType @   modules.js?hash=107dc56โ€ฆ:21099
receiveProps    @   modules.js?hash=107dc56โ€ฆ:21089
DragSource(NestedComponent) @   modules.js?hash=107dc56โ€ฆ:21062
ReactCompositeComponentMixin.mountComponent @   modules.js?hash=107dc56โ€ฆ:6679
ReactCompositeComponent_mountComponent  @   modules.js?hash=107dc56โ€ฆ:896
ReactReconciler.mountComponent  @   modules.js?hash=107dc56โ€ฆ:5167
ReactMultiChild.Mixin.mountChildren @   modules.js?hash=107dc56โ€ฆ:13562
ReactDOMComponent.Mixin._createContentMarkup    @   modules.js?hash=107dc56โ€ฆ:10901
ReactDOMComponent.Mixin.mountComponent  @   modules.js?hash=107dc56โ€ฆ:10789
ReactReconciler.mountComponent  @   modules.js?hash=107dc56โ€ฆ:5167
ReactCompositeComponentMixin._updateRenderedComponent   @   modules.js?hash=107dc56โ€ฆ:7101
ReactCompositeComponentMixin._performComponentUpdate    @   modules.js?hash=107dc56โ€ฆ:7075
ReactCompositeComponentMixin.updateComponent    @   modules.js?hash=107dc56โ€ฆ:7004
ReactCompositeComponent_updateComponent @   modules.js?hash=107dc56โ€ฆ:896
ReactCompositeComponentMixin.receiveComponent   @   modules.js?hash=107dc56โ€ฆ:6936
ReactReconciler.receiveComponent    @   modules.js?hash=107dc56โ€ฆ:5217
ReactCompositeComponentMixin._updateRenderedComponent   @   modules.js?hash=107dc56โ€ฆ:7093
ReactCompositeComponentMixin._performComponentUpdate    @   modules.js?hash=107dc56โ€ฆ:7075
ReactCompositeComponentMixin.updateComponent    @   modules.js?hash=107dc56โ€ฆ:7004
ReactCompositeComponent_updateComponent @   modules.js?hash=107dc56โ€ฆ:896
ReactCompositeComponentMixin.receiveComponent   @   modules.js?hash=107dc56โ€ฆ:6936
ReactReconciler.receiveComponent    @   modules.js?hash=107dc56โ€ฆ:5217
ReactCompositeComponentMixin._updateRenderedComponent   @   modules.js?hash=107dc56โ€ฆ:7093
ReactCompositeComponentMixin._performComponentUpdate    @   modules.js?hash=107dc56โ€ฆ:7075
ReactCompositeComponentMixin.updateComponent    @   modules.js?hash=107dc56โ€ฆ:7004
ReactCompositeComponent_updateComponent @   modules.js?hash=107dc56โ€ฆ:896
ReactCompositeComponentMixin.performUpdateIfNecessary   @   modules.js?hash=107dc56โ€ฆ:6952
ReactReconciler.performUpdateIfNecessary    @   modules.js?hash=107dc56โ€ฆ:5232
runBatchedUpdates   @   modules.js?hash=107dc56โ€ฆ:5832
Mixin.perform   @   modules.js?hash=107dc56โ€ฆ:6304
Mixin.perform   @   modules.js?hash=107dc56โ€ฆ:6304
assign.perform  @   modules.js?hash=107dc56โ€ฆ:5789
flushBatchedUpdates @   modules.js?hash=107dc56โ€ฆ:5850
ReactUpdates_flushBatchedUpdates    @   modules.js?hash=107dc56โ€ฆ:896
Mixin.closeAll  @   modules.js?hash=107dc56โ€ฆ:6370
Mixin.perform   @   modules.js?hash=107dc56โ€ฆ:6317
ReactDefaultBatchingStrategy.batchedUpdates @   modules.js?hash=107dc56โ€ฆ:10295
enqueueUpdate   @   modules.js?hash=107dc56โ€ฆ:5879
enqueueUpdate   @   modules.js?hash=107dc56โ€ฆ:5460
ReactUpdateQueue.enqueueSetState    @   modules.js?hash=107dc56โ€ฆ:5626
ReactComponent.setState @   modules.js?hash=107dc56โ€ฆ:15132
handleChange    @   modules.js?hash=107dc56โ€ฆ:21121
handleChange    @   modules.js?hash=107dc56โ€ฆ:22861
dispatch    @   modules.js?hash=107dc56โ€ฆ:23568
(anonymous function)    @   modules.js?hash=107dc56โ€ฆ:22100
endDragIfSourceWasRemovedFromDOM    @   modules.js?hash=107dc56โ€ฆ:29563
handleTopDrop   @   modules.js?hash=107dc56โ€ฆ:29860

์ด์— ๋Œ€ํ•œ ์˜ˆ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

class ParentDraggable extends React.Component {
    render() {
        return this.props.connectDragSource(
            <NestedDraggable/>
        );
    }
}

//... Skip the code for containers

class NestedDraggable extends React.Component {
    render() {
        return this.props.connectDragSource(
            <div></div>
        );
    }
}

์ด ๋ฌธ์ œ๋Š” ๋ถ€๋ชจ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋‹ค์‹œ ๋ Œ๋”๋งํ•˜๋ฉด receiveProps ํ•จ์ˆ˜ ํ˜ธ์ถœ ์ค‘์— ์ž์‹ DragSource ํ˜ธ์ถœ์ด setState๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์—์„œ ๋น„๋กฏ๋œ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

triage wontfix

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

๋ˆ„๊ตฐ๊ฐ€์—๊ฒŒ ๋„์›€์ด๋˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๋Œ€๋น„ํ•˜์—ฌ : ์‚ฌ์šฉ์ž ์ •์˜ ๋“œ๋ž˜๊ทธ ๋ ˆ์ด์–ด์—์„œ ๋“œ๋ž˜๊ทธ ์†Œ์Šค ์ธ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋ Œ๋”๋ง ํ•  ๋•Œ ํŽธ๋ฆฌํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๋“œ๋ž˜๊ทธ ์†Œ์Šค ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋“œ๋ž˜๊ทธํ•˜๋ ค๊ณ ํ–ˆ๋˜ ์—”ํ‹ฐํ‹ฐ์™€ ๋™์ผํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”๋“œ๋ฅผ ์žฌ์‚ฌ์šฉํ•˜์—ฌ "DRY"๋ฅผ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๋ชจ๋“  dragSource ์ฝ”๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜์ง€ ์•Š์•˜๋‹ค. ๋˜๋Œ์•„ ๋ณด๋ฉด, _ ๋ฌผ๋ก  _ ๋“œ๋ž˜๊ทธ ์†Œ์Šค๊ฐ€ ์ปค์Šคํ…€ ๋“œ๋ž˜๊ทธ ๋ ˆ์ด์–ด์—์„œ ๋ Œ๋”๋ง๋˜๋Š” ๊ฒƒ์„ ์›ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋‹ค.

๊ถ๊ทน์ ์œผ๋กœ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๊ธฐ๋ณธ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๊ฐ์‹ธ๋Š” "Draggable"๋ฒ„์ „์œผ๋กœ ๋ถ„ํ•  ํ•œ ๋‹ค์Œ ์‚ฌ์šฉ์ž ์ง€์ • ๋“œ๋ž˜๊ทธ ๋ ˆ์ด์–ด์—์„œ ๊ธฐ๋ณธ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ๋” ์ด์ƒ ๊ฒฝ๊ณ ์—†์ด ๋” ๋‚˜์€ ์ฝ”๋“œ! ๐Ÿ‘

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

: +1 :

๋ฌธ์ œ๋ฅผ ์žฌํ˜„ํ•˜๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ์ œ๊ณตํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

์ €๋Š” ๊ฐ„๋‹จํ•œ ์˜ˆ์ œ๋ฅผ ๋งŒ๋“ค๋ ค๊ณ  ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ์ œ๊ฐ€ ์ž‘์—…์ค‘์ธ ๊ฐœ์ธ ํ”„๋กœ์ ํŠธ ์™ธ๋ถ€์—์„œ ์žฌ์ƒ์‚ฐํ•˜๋Š” ๋ฐ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. @nihtalak , ๋ฌธ์ œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” Github์— ์ €์žฅ์†Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

๋‹ค์Œ์€ ์„ค๋ช… ๋œ ๋™์ž‘์„ ๋ณด์—ฌ์ฃผ๋Š” ์ž‘์€ ์ €์žฅ์†Œ์ž…๋‹ˆ๋‹ค. https://github.com/ebakan/react-dnd-nested-bug

ํฅ๋ฏธ๋กญ๊ฒŒ๋„ Component ๋Š” monitor.getItem() ์ˆ˜์‹  ํ•  ๋•Œ๋งŒ์ด ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. monitor.isDragging() ์ˆ˜์‹ ํ•˜๋Š” ๊ฒฝ์šฐ https://github.com/ebakan/react-dnd-nested-bug/tree/no-error-with-is- ๋ธŒ๋žœ์น˜์— ํ‘œ์‹œ๋œ๋Œ€๋กœ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

monitor.getItemType() ์ฒญ์ทจ ํ•  ๋•Œ๋„ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. https://github.com/ebakan/react-dnd-nested-bug/tree/error-with-get-item-type

@ebakan- ํฅ๋ฏธ ๋กญ์Šต๋‹ˆ๋‹ค. isDragging์„ ์‚ฌ์šฉํ•˜๋Š” ๋‚ด ์ฝ”๋“œ์—์ด ๋ฒ„๊ทธ๊ฐ€ ๋‚˜ํƒ€๋‚˜๋Š” ์›์ธ์ด ๋ฌด์—‡์ธ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ์ค‘์ฒฉ ๋œ ๋“œ๋ž˜๊ทธ ๊ฐ€๋Šฅ ํ•ญ๋ชฉ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด์ƒํ•œ ์ผ์„ํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ๋ณด๊ณ ์žˆ๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•œ ๋ฒ„๊ทธ๊ฐ€ ๋‚˜ํƒ€๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์žฌํ˜„ ํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

๋‚˜๋Š” ์ค‘์ฒฉ ๋“œ๋ž˜๊ทธ ๊ฐ€๋Šฅ ํ•ญ๋ชฉ๋„ ์žˆ์ง€๋งŒ ๊ทธ๊ฒŒ ๋ฌธ์ œ์ธ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
์ƒˆ ์ƒ์ ๊ณผ ๋“ฃ๊ณ ์žˆ๋Š” ์ฝ”๋“œ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋„์›€์ด๋œ๋‹ค๋ฉด ๋™์˜์ƒ์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.
http://screencast.com/t/qCrJRPAS2MYR

์—…๋ฐ์ดํŠธ : ๋ฌธ์ œ๋ฅผ ๋ฐœ๊ฒฌํ•˜๊ณ  ๋‚จ์€ ์ฒญ์ทจ์ž๊ฐ€ ์žˆ์—ˆ์œผ๋ฏ€๋กœ ์ œ ๊ฒฝ์šฐ์—๋Š” react-dnd ๋•Œ๋ฌธ์ด ์•„๋‹™๋‹ˆ๋‹ค.
Update2 : ๋„ˆ๋ฌด ๋นจ๋ฆฌ ๋ง ํ–ˆ์–ด์š”. ๋‚จ์€ ์ฒญ์ทจ์ž๋ฅผ ์ œ๊ฑฐํ•ด๋„ ์—ฌ์ „ํžˆ ๊ฒฝ๊ณ ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

๋ฐฉ๊ธˆ Dnd๋ฅผ ๋‹ค๋ฅธ ๊ตฌ์„ฑ ์š”์†Œ์— ์ถ”๊ฐ€ํ–ˆ์œผ๋ฉฐ ์ค‘์ฒฉ๋˜๊ฑฐ๋‚˜ ์—ฌ๋Ÿฌ ๋“œ๋ž˜๊ทธ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์—†์–ด๋„์ด ๋ฌธ์ œ๋ฅผ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.

์•ฝ๊ฐ„์˜ ํŒŒ๊ณ ๋ฅผ ํ•œ ํ›„ ๋ฌธ์ œ๊ฐ€ ๋“œ๋ž˜๊ทธ๋˜๋Š” ๋™์•ˆ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋ Œ๋”๋งํ•˜๋Š” ์‚ฌ์šฉ์ž ์ •์˜ ๋“œ๋ž˜๊ทธ ๋ ˆ์ด์–ด์™€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์Œ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.

๋“œ๋ž˜๊ทธ๋˜๋Š” ๊ตฌ์„ฑ ์š”์†Œ ๋Œ€์‹  ํ…์ŠคํŠธ๋ฅผ ๋„ฃ์œผ๋ฉด ์ œ๋Œ€๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ตฌ์„ฑ ์š”์†Œ ์ž์ฒด๊ฐ€ ๋“œ๋ž˜๊ทธ ์†Œ์Šค์ž…๋‹ˆ๋‹ค.

@jchristman @hakunin ์ค‘์ฒฉ ๋œ ๋“œ๋ž˜๊ทธ ๊ฐ€๋Šฅ ํ•ญ๋ชฉ์ด ์—†์ง€๋งŒ isDragging ๊ธฐ๋ฐ˜์œผ๋กœ ์กฐ๊ฑด๋ถ€๋กœ ๋ Œ๋”๋ง ๋œ ๋“œ๋กญ ๋Œ€์ƒ์ด์žˆ์„ ๋•Œ Cannot update during an existing state transition ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ์˜ˆ์—์„œ ์ด๊ฒƒ์ด ํ•ด๋‹น ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ :

render() {
    var dropZone;
    if (this.props.isDragging) dropZone = <MyDropTarget />;
    return <div>
       <MyDragSource />
       {dropZone}
    </div>
}

๋“œ๋ž˜๊ทธ๊ฐ€ ํ™œ์„ฑํ™”๋˜์—ˆ์„ ๋•Œ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์ œ๊ฑฐํ•˜๋Š” ๋Œ€์‹  display: none/block ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋Œ€์ƒ์„ ์ˆจ๊ธฐ๋Š” ๋ฐฉ์‹์œผ๋กœ ์ž‘์—…์„ ๋๋ƒˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฒŒ ๋ฌธ์ œ ๊ฐ€ ๋ 

Naw- "๋“œ๋กญ"์ด ๋ฐœ์ƒํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋‹ค์‹œ ๋ Œ๋”๋งํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜๊ณ ์ด ๊ฒฝ๊ณ ๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

๋‚ด ๋“œ๋ž˜๊ทธ ๋ฏธ๋ฆฌ๋ณด๊ธฐ๊ฐ€ DragSource (๋‚ด๊ฐ€ํ•ด์„œ๋Š” ์•ˆ๋˜๋Š”) ์ธ ๊ตฌ์„ฑ ์š”์†Œ ์ผ ๋•Œ ๋™์ผํ•œ ๊ฒฝ๊ณ ๋ฅผ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค.

@jchristman ๋‹น์‹ ์€ ์ด๊ฒƒ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์„ ์ƒ๊ฐํ•ด

์ค‘์ฒฉ ๋œ dragSources๋กœ ์ž‘์—…ํ•˜๊ณ  ์ค‘์ฒฉ ๋œ ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ญ์ œํ•  ๋•Œ ๊ฐ‘์ž๊ธฐ์ด ์˜ค๋ฅ˜๊ฐ€ ํ‘œ์‹œ๋˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ์ œ๋ฅผ ์ œ๊ณต ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋ˆ„๊ตฐ๊ฐ€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ๋Š”์ง€ ๋˜๋Š” ์ ์ ˆํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.

๋‚ด ๋“œ๋ž˜๊ทธ ๋ฏธ๋ฆฌ๋ณด๊ธฐ๊ฐ€ DragSource (๋‚ด๊ฐ€ํ•ด์„œ๋Š” ์•ˆ๋˜๋Š”) ์ธ ๊ตฌ์„ฑ ์š”์†Œ ์ผ ๋•Œ ๋™์ผํ•œ ๊ฒฝ๊ณ ๋ฅผ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค.

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค @arjunu ๋‚ด ๊ฒฝ๊ณ ๋Š” ์ด๊ฒƒ์œผ๋กœ ์ธํ•ด ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค!
๋‚˜๋Š” ์•„์ง๋„ ์ด๊ฒƒ๋“ค์„ ๊ฐ€๋” ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฏ€๋กœ ๋‹ค๋ฅธ ์ด์œ ๋„ ๊ณ ์ณ์•ผ ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‚ด ํŽธ์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค :)

@ gharwood1 , ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ ๋  ๋•Œ๊นŒ์ง€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‹ค์ œ๋กœ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด ๋ช‡ ์‹œ๊ฐ„์„ ๋ณด๋ƒˆ์œผ๋ฏ€๋กœ ์ˆ˜์ •์„ ์š”์ฒญํ•  ์ˆ˜ ์žˆ์—ˆ์ง€๋งŒ ๊ฝค ๋ณต์žกํ•ด์„œ ๊ณ„์† ์ง„ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ์‹œ๊ฐ„์ด ์—†์–ด ... :-(

@gaearon ๋‚˜๋Š” ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๋‹น๊ธธ ์ˆ˜์žˆ๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค์ง€๋Š” ์•Š์•˜์ง€๋งŒ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ ๋‚ด๊ฐ€ ์—ฌ๊ธฐ์„œํ•˜๋ ค๋Š” ๊ฒƒ์€ ์œ ํšจํ•ฉ๋‹ˆ๋‹ค.

https://github.com/arackaf/booklist/blob/react-dnd-bug-freeze/react-redux/modules/subjects/components/subjectsList-es6.js

64 ํ–‰์—์„œ ์กฐ๊ฑด๋ถ€๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•˜๋ฉด ๋ชจ๋“  ๊ฒƒ์ด ์ •์ƒ์ž…๋‹ˆ๋‹ค

if (this.props.draggingSubject){
    effectiveChildren.push(this.props.draggingSubject);
}

๊ทธ๋Ÿฌ๋‚˜ ๋“œ๋ž˜๊ทธ ์ด๋ฒคํŠธ์˜ ๊ฒฐ๊ณผ๊ฐ€ ์†Œํ’ˆ์„ ์ˆ˜์ •ํ•˜๊ณ  ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋ Œ๋”๋งํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๋Š” ์ˆœ๊ฐ„ ์œ„์˜ ๊ฒฝ๊ณ ๊ฐ€ ์ž์ฃผ ๋ฐœ์ƒํ•˜๊ธฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌ๋ฉด ์•ˆ๋˜๋‚˜์š”?

์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋“œ๋กญ ๋Œ€์ƒ์—์„œ ํ˜„์žฌ ๋“œ๋ž˜๊ทธ ๋œ ํ•ญ๋ชฉ์„ "๋ฏธ๋ฆฌ๋ณด๊ธฐ"ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์œ„์˜ ๋‚ด์šฉ์€ ๊ฐœ๋… ์ฆ๋ช…์ž…๋‹ˆ๋‹ค. ์•„์ง Redux ์Šคํ† ์–ด์— ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์œ ํšจํ•œ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.


ํ , ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ SubjectDisplayContent ๋กœ์ปฌ๋กœ ์œ ์ง€ํ•ด๋„ ๊ดœ์ฐฎ์€ ๊ฒƒ ๊ฐ™์ง€๋งŒ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด SubjectDisplay ๊นŒ์ง€ ํ™•์žฅ๋˜๋ฉด ๊ฒฝ๊ณ ๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ dropTarget์ด ๋‹ค๋ฅธ dropTarget์„ ์ˆ˜์ •ํ•˜๋Š” props๋ฅผ ๋ณด๋‚ด๋ฉด react-dnd๊ฐ€ ์งœ์ฆ์„๋ƒ…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์˜ˆ์ƒ๋˜๋Š” ๊ฒƒ์ž…๋‹ˆ๊นŒ, ๊ทธ๋ฆฌ๊ณ  ๋ช‡ ๊ฐ€์ง€๋ฅผ ๋‹ค์‹œ ์ƒ๊ฐํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด dnd์˜ ๋ฒ„๊ทธ์ž…๋‹ˆ๊นŒ?

๋˜‘๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ถ€ ์ƒํ™ฉ์—์„œ ํ•  ์ˆ˜์žˆ๋Š” ๊ฒƒ์€ ๊ฐ ์ค‘์ฒฉ ๋œ ๋“œ๋ž˜๊ทธ ๊ฐ€๋Šฅ ํ•ญ๋ชฉ ์ฃผ์œ„์— DragDropContext ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ์‚ฌ์šฉ์ž ์ •์˜ DragLayer๋ฅผ ์›ํ•˜๋Š” ์ฆ‰์‹œ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ค‘์ฒฉ ๋œ dropTargets๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์„ ์ œ์™ธํ•˜๊ณ ๋Š” ๋™์ผํ•œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
์„ค๋ช…์„œ๋ฅผ ๋‘˜๋Ÿฌ ๋ณธ ํ›„

isOver (์˜ต์…˜) : ๋“œ๋ž˜๊ทธ ์ž‘์—…์ด ์ง„ํ–‰ ์ค‘์ด๊ณ  ํฌ์ธํ„ฐ๊ฐ€ ํ˜„์žฌ ์†Œ์œ ์ž ์œ„์— ์žˆ์œผ๋ฉด true๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์„ ํƒ์ ์œผ๋กœ {shallow : true}๋ฅผ ์ „๋‹ฌํ•˜์—ฌ ์ค‘์ฒฉ ๋œ ๋Œ€์ƒ์ด ์•„๋‹ˆ๋ผ ์†Œ์œ ์ž ๋งŒ ํ˜ธ๋ฒ„๋ง๋˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์—„๊ฒฉํ•˜๊ฒŒ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

(shallow is true ์˜ต์…˜ ์‚ฌ์šฉ) ๋ถ€๋ชจ dropTarget์˜ canDrop ํ•จ์ˆ˜์—์„œ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์‹œ๋‚˜๋ฆฌ์˜ค์—๋„ ๋™์ผํ•˜๊ฒŒ ์ ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

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

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

printWarning    @   warning.js?8a56:36
warning @   warning.js?8a56:60
getInternalInstanceReadyForUpdate   @   ReactUpdateQueue.js?6531:54
enqueueSetState @   ReactUpdateQueue.js?6531:200
ReactComponent.setState @   ReactComponent.js?702a:63
handleChange    @   DragLayer.js?1cbc:124 <--------------
handleChange    @   DragDropMonitor.js?0588:60

๊ด€๋ จ ์ฝ”๋“œ๋Š” ์—ฌ๊ธฐ์— ์žˆ์Šต๋‹ˆ๋‹ค . ๋‹ค์‹œ ๋ Œ๋”๋ง์„ ํŠธ๋ฆฌ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด ๋‚ด ๊ฒฝ์šฐ ์ƒํƒœ๊ฐ€ ๋‹ค๋ฅธ ์ด์œ ๋ฅผ ์‚ดํŽด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

dragsource + droptarget์ด droptarget ์•ˆ์— ์ค‘์ฒฉ๋˜์–ด ์žˆ์œผ๋ฉด์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

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

๋ˆ„๊ตฐ๊ฐ€์—๊ฒŒ ๋„์›€์ด๋˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๋Œ€๋น„ํ•˜์—ฌ : ์‚ฌ์šฉ์ž ์ •์˜ ๋“œ๋ž˜๊ทธ ๋ ˆ์ด์–ด์—์„œ ๋“œ๋ž˜๊ทธ ์†Œ์Šค ์ธ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋ Œ๋”๋ง ํ•  ๋•Œ ํŽธ๋ฆฌํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๋“œ๋ž˜๊ทธ ์†Œ์Šค ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋“œ๋ž˜๊ทธํ•˜๋ ค๊ณ ํ–ˆ๋˜ ์—”ํ‹ฐํ‹ฐ์™€ ๋™์ผํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”๋“œ๋ฅผ ์žฌ์‚ฌ์šฉํ•˜์—ฌ "DRY"๋ฅผ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๋ชจ๋“  dragSource ์ฝ”๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜์ง€ ์•Š์•˜๋‹ค. ๋˜๋Œ์•„ ๋ณด๋ฉด, _ ๋ฌผ๋ก  _ ๋“œ๋ž˜๊ทธ ์†Œ์Šค๊ฐ€ ์ปค์Šคํ…€ ๋“œ๋ž˜๊ทธ ๋ ˆ์ด์–ด์—์„œ ๋ Œ๋”๋ง๋˜๋Š” ๊ฒƒ์„ ์›ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋‹ค.

๊ถ๊ทน์ ์œผ๋กœ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๊ธฐ๋ณธ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๊ฐ์‹ธ๋Š” "Draggable"๋ฒ„์ „์œผ๋กœ ๋ถ„ํ•  ํ•œ ๋‹ค์Œ ์‚ฌ์šฉ์ž ์ง€์ • ๋“œ๋ž˜๊ทธ ๋ ˆ์ด์–ด์—์„œ ๊ธฐ๋ณธ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ๋” ์ด์ƒ ๊ฒฝ๊ณ ์—†์ด ๋” ๋‚˜์€ ์ฝ”๋“œ! ๐Ÿ‘

@davidjoy woah, ๊ณต์œ ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ์ €๋„ ๋˜‘๊ฐ™์€ ์ผ์„ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์‹œ๋„ํ•ด ๋ณผ ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค!

@davidjoy ๋ฐฉ๊ธˆ ๋‚ด

์ด ๋ฌธ์ œ๋Š” ์ตœ๊ทผ ํ™œ๋™์ด ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ž๋™์œผ๋กœ ์˜ค๋ž˜๋œ ๊ฒƒ์œผ๋กœ ํ‘œ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋” ์ด์ƒ ํ™œ๋™์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์œผ๋ฉด ํ์‡„๋ฉ๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ๊ธฐ์—ฌ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

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