ãŠãŒã¶ãŒããã¡ã€ã«ããã©ãã°ã¢ã³ãããããããŠã¢ããããŒãã§ããã«ã¹ã¿ã ãã«ãã®ãããããŸãŒã³ã³ã³ããŒãã³ãããããŸãã æ®å¿µãªãããreact-dndã¯ããã劚害ããŠããŸãã ãã¡ã€ã«ããããããŸãŒã³ã«ãã©ãã°ããããšãæ©èœããå Žåãããã°ãäœãèµ·ãããªãå ŽåããããŸãïŒ onDrop
ã¯èµ·åãããŸããïŒã å©èšããããŸããïŒ
ç§ã¯å察ã®åé¡ãæ±ããŠããŸããã HTML5ããã¯ãšã³ããdropzoneã§æ©èœãããã«ã¯ã次ã®ããšãè¡ãå¿ èŠããããŸããã
beginDrag(props) {
Dropzone.instances[0].disable()
ãããŠ
endDrag(props, monitor, component) {
Dropzone.instances[0].enable()
ç§ã®ãããããŸãŒã³ã¯ããã£ã«åãä»ããããŠããã®ã§ãåãä»ãé åºãè©ŠããŠã¿ãããšããå§ãããŸãã
ããã£å
šäœã«äœæããŠããããã¡ã€ã«ãããããããå Žæã«åºã¥ããŠã¢ã¯ã·ã§ã³ãå®è¡ããããšããä»ã«äœãæ©èœããªãå Žåã®æ¹æ³ã«ãªããšæããŸãã
ãŸãããã©ãã°å¯èœãªã¢ã€ãã ã«<input>
ãããããŠãŒã¶ãŒããã®äžãéžæ/ãã©ãã°ãããšãã¢ã€ãã ããã©ãã°ããããšããåé¡ãçºçããŸããã å
¥åããã©ãŒã«ã¹ãããŠããå Žåã¯ãããããcanDrag
ããfalse
ãè¿ãããšãã§ããŸãããããã§ããŸãããã¯ãã§ãã
ãã ããHTMLã®ãã©ãã°ã¢ã³ãããããã¢ããããŒãã®å¹²æžã«å¯ŸåŠããæ¹æ³ãããããŸããã ã¬ã€ã¢ãŠãå šäœã§ãã§ã«æå¹ã«ããŠããŸãã @gaearon ãèãïŒ
@ffxsamããã¯ãŸã ããªãã«ãšã£ãŠåé¡ã§ããïŒ
ç¥ããŸããã ãã®åé¡ã®ããã«ã¢ã³ã€ã³ã¹ããŒã«ããå¿ èŠããã£ãã®ã§ãããããŸã åé¡ã§ãããã©ããã¯ããããŸããã§ãã-ããããªããïŒ å¿ èŠã«å¿ããŠããã®åé¡ãéããããšãã§ããŸãã
ããã«ã¡ã¯ãç§ã¯ã¡ããã©åãåé¡ã«ééããŸãããç§ã¯åé¡ãéãããšããŠããŸããããããç§ã¯ããããã§ã«éããŠããã®ãèŠãŸãã
ã€ãŸããReactDnDãã€ã³ã¹ã¿ã³ã¹åãããšããã€ãã£ãã®onDropã€ãã³ããæ©èœããªããªããŸãã
ç§ã¯åããŠãŒã¹ã±ãŒã¹ãæã£ãŠããŸããå
šèº«ã¯åžžã«ãã©ãã°ããããã¡ã€ã«ããªãã¹ã³ããããããããŸãŒã³ãã§ããéåžžã«ã·ã³ãã«ãªæ©èœã§ãããç®±ããåºããŠæ¥ãã®ã§ããã®ã³ã³ããŒãã³ãã«ãã€ãã£ãã€ãã³ãã䜿çšããŠããŸãã ããããReactDnDãæ©èœããŠãããã¥ãŒã§ã¯ãdropã€ãã³ãã¯çºçãããonDragEnterãŸãã¯onDragStartã€ãã³ããäžæžãããªãããé¢çœãã§ãã
æããã@ kesne @ gaearon ïŒ ç§ã¯æ¬åœã«ReactDnDãã¢ã³ã€ã³ã¹ããŒã«ããããããŸãããããã¯Reactã®æé«ã®ãã©ãã°ã¢ã³ãããããäŸåé¢ä¿ã§ãã
@kesne @ gaearon @ xavibonellãšåãåé¡ãçºçããŠããŸãã ç§ã¯åºæ¬çã«Wordpressã§ReactDNDã䜿çšããŠãããWordpressã¡ãã£ã¢ã¢ããããŒããŒã¯ãã¡ã€ã«ã®ã¢ããããŒãã«ãã€ãã£ãããããã€ãã³ãã䜿çšããŸãã ãã®onDropã³ãŒã«ããã¯ã¯ãReactDNDãã¢ããªã§äœ¿çšãããŠããå Žåã«ã®ã¿çºçããŸããã Reactdndããããã¿ãŒã²ãããåé€ãããšãåé¡ã解決ããŸãã ç§ã¯ãã®ãããžã§ã¯ãã«æ°ãæãè²»ãããŸããããreactdndã¯ãã®äžæ žéšåã§ãããåºã䜿çšãããŠããŸãã ãã®æç¹ã§ãç§ã¯ééããªãå¥ã®å³æžé€šã«ç§»åããäœè£ããããŸããã ãã®ã¹ã¬ãããšStackOverflowã®åæ§ã®ã¬ããŒãããããã®åé¡ã¯ããªãåããååšããŠããããšãããããŸãã ããã«å¯Ÿãã解決çã¯å€§æè¿ã§ãã
ããããã€ãã£ãèŠçŽ ãšã«ã¹ã¿ã dndèŠçŽ ã®éã«ããã€ãã®æªãçžäºäœçšãããå¯èœæ§ããããŸãã çŸåšããã®åé¡ã調æ»ããæéã¯ããŸããããŸãããããã®ãããžã§ã¯ãã®ããã«æéãåã£ãŠããããšãèšç»ããŠãããããã¯ç§ãæåã«èª¿æ»ããåé¡ã®1ã€ã«ãªããŸãã
å¯èœã§ããã°ããããåŠçããããã®æè¯ã®æ¹æ³ãèŠã€ãåºãããšãã§ããããã«ãè€è£œã®äŸã䜿çšããŠæå°éã®ãªããžããªèšå®ãååŸãããšéåžžã«äŸ¿å©ã§ãã
@kesneãåçããããšãããããŸãããã®åé¡ã調æ»ããããšãç¥ã£ãŠã
ãã®éãç§ã¯äžæçãªããã¯ãèãåºããããã§ããŸã 培åºçã«ãã¹ãããŠããŸããããä»ã®ãšããããŸãããããã§ãã HTML5Backendã«setupïŒïŒé¢æ°ãšteardownïŒïŒé¢æ°ãããããã¹ãŠã®ã€ãã³ããªã¹ããŒããŠã£ã³ããŠèŠçŽ ã«ãã€ã³ãããŠããããšã«æ°ä»ããŸããã ç§ã®å Žåãã¯ãŒããã¬ã¹ãã¡ã€ã«ã¢ããããŒããŒã¯ç»é¢å
šäœãå ããã¢ãŒãã«ããã¯ã¹ã§ãããããã¢ãŒãã«ãéããŠãããšãã«ReactDNDèŠçŽ ããã©ãã°ãŸãã¯ããããããããšã¯ã§ããŸããã ãã®ãããã¢ãŒãã«ãŠã£ã³ããŠã®openã€ãã³ãäžã«ãããã¯ãšã³ãã®ã€ã³ã¹ã¿ã³ã¹ïŒDragDropManagerãä»ããŠå©çšå¯èœïŒã§teardownïŒïŒé¢æ°ãåŒã³åºããã¢ãŒãã«ã®ã¯ããŒãºäžã«setupïŒïŒé¢æ°ãåŒã³åºããŸãã ããã¯æ£åžžã«æ©èœããŠããããã§ããããã£ã¢ããŠã³é¢æ°ãšã»ããã¢ããé¢æ°ãå床åŒã³åºããšãæ¢åãŸãã¯æ°ããã¬ã³ããªã³ã°ãããã³ã³ããŒãã³ãã§ReactDNDã«ä»ã®åé¡ãçºçããå¯èœæ§ããããã©ãããæããŠãã ããã
ãããåé¡ã§ãïŒ https ïŒ
ã³ãŒãã®ã³ã¡ã³ããçŽ æµãªã«ãŒãœã«ã衚瀺ããªãã§ãã ãããã«åºã¥ããšã e.dataTransfer.dropEffect
ãåãªã衚瀺ããããã£ãšããŠæ±ã£ãŠããããã§ãã ãã ããdropEffectãnone
ã«èšå®ãããšãå®éã«ã¯ãã¡ã€ã«ããã¹ãŠäžç·ã«ãããããããã®ãé²ãããã«èŠããŸãã move
ã copy
ããŸãã¯link
èšå®ãããšåé¡ãªãæ©èœããããšã«æ³šæããŠãã ããã ããã¯Chrome55.0.2ã«ãããŸãã
å®éã«ã¯ãreact-dndã®å€éšã§ããããã¹ãŠäžç·ã«è€è£œã§ããŸãã åé¡ãåãåãããã£ãã«ãäœæããŸããïŒ https ïŒ
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)
ã
ãã®ãããã®æ¢ç¥ã®å¯äœçšãŸãã¯å©çšå¯èœãªããè¯ãä¿®æ£ã¯ãããŸããïŒ ããã§ãªããã°ãããã¯ããããæ°žä¹ ã«ããŒãžãããå¯èœæ§ããããŸããïŒ
ãã¹ãŠã®çŽ æŽãããäœæ¥ã«æè¬ããåé¿çãèŠã€ããŠããã
[ç·šé]
ãã®åé¡ãã¡ã€ã³ãããžã§ã¯ãã§è§£æ±ºããããŸã§ã Githubãã©ãŒã¯ãšnpmããã±ãŒãžãäœæããŸããã
åé¿çãããããšã
ãã¹ãããããããããŸãŒã³ã®react-dropzoneã®äŸã䜿çšãããšãããŸãããããšãããããŸããã ããã¯äŒæãåæ¢ããŸããããããåé¡ã ãšæããŸãã ä»æ¥ãã®åé¡ãèŠã€ãããŸã§ããããç§ã®åé¿çã§ãã
ç§ã¯ãããšåãåé¡ãçµéšããŠããŸãã ãã¹ãããããããããŸãŒã³ã®ã¢ã€ãã¢ãèãããšãdivå ã«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æ©èœã«ããã»ã©å¹²æžããå¯èœæ§ããããšããèãã¯å¥œãã§ã¯ãããŸããã ããã¯å€§ããªäºæ ã®ããã«æãããŸããreact-dndãdïŒd DOMããŒãã«äœ¿çšããŠããäžéšã®ã³ã³ããŒãã³ãããå¥ã®ã³ã³ããŒãã³ãã®dïŒdãã¡ã€ã«ã®ããããæ©èœãå£ãå¯èœæ§ããããŸãã ã©ã€ãã©ãªã§ãããä¿®æ£ããããã®+1
ãã¶ããããã€ãã®ç°¡åãªè§£æ±ºçã¯ãdropEffectãäœããã®ãããããã§ãŒã³ãä»ããŠäœããã®åœ¢ã§æå®ãããå¯èœæ§ããããšããããšã§ããããïŒ
HTML5ããã¯ãšã³ãã«@silvainSayduckãã©ãŒã¯ã䜿çšããããšã«
ããã«ãããä¿®æ£ãããå¯èœæ§ã¯ãããŸããïŒ @silvainSayduckä¿®æ£ã®ãã«ãªã¯ãšã¹ããéãããšãã§ããŸããïŒ
ãªããžããªãããã«ãªã¯ãšã¹ããäœæããŸããããããã倧ãã«åœ¹ç«ã€ãã©ããã¯ããããŸããïŒ1è¡ã«æãŸãããªãå¯äœçšããããã©ããããŸãã¯ãã¹ãŠã®ãŠãŒã¹ã±ãŒã¹ã§åé¡ãä¿®æ£ããããã©ããã¯ãŸã ããããŸããïŒã
@darthtrevinoãã®ãããžã§ã¯ããžã®è²¢ç®è ãšããŠ
PRãèŠãŠã¿ããšããããäŸã«åããªãããšã確èªããå¿ èŠãããã ãã§åççã«èŠããŸã
ïŒ1240ã«çµ±å
ã©ããããããšã@darthtrevinoïŒ ããã¯npmããŒãžã§ã³ã§ãã€ãªãªãŒã¹ãããäºå®ã§ããïŒ
1æ¥ã®çµãããŸã§ã«ããã®ãããžã§ã¯ãã®æéã確ä¿ãããšããç§ã®éåžžã®ã¯ãŒã¯ãããŒã¯ãPRã®ããããåŠçããŠããããªãªãŒã¹ãã«ããããããšã§ãã
@darthtrevinoã¯çŸåšã®ãªãªãŒã¹ã§å©çšã§ããŸããïŒ ãã€å©çšå¯èœã«ãªããŸããïŒ
ãããããã¯çŸåšã®ãªãªãŒã¹ã«ãããšæããŸãã åé¡ãçºçããå Žåã¯ãç¥ãããã ãã
@darthtrevinoããããšãããããŸããå©çšå¯èœã§ãã
ç§ã¯ãããšåãåé¡ãçµéšããŠããŸãã ãã¹ãããããããããŸãŒã³ã®ã¢ã€ãã¢ãèãããšãdivå ã«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æ©èœã«ããã»ã©å¹²æžããå¯èœæ§ããããšããèãã¯å¥œãã§ã¯ãããŸããã ããã¯å€§ããªäºæ ã®ããã«æãããŸããreact-dndãdïŒd DOMããŒãã«äœ¿çšããŠããäžéšã®ã³ã³ããŒãã³ãããå¥ã®ã³ã³ããŒãã³ãã®dïŒdãã¡ã€ã«ã®ããããæ©èœãå£ãå¯èœæ§ããããŸãã ã©ã€ãã©ãªã§ãããä¿®æ£ããããã®+1
ãã¶ããããã€ãã®ç°¡åãªè§£æ±ºçã¯ãdropEffectãäœããã®ãããããã§ãŒã³ãä»ããŠäœããã®åœ¢ã§æå®ãããå¯èœæ§ããããšããããšã§ããããïŒ
handleDragOver [Dropzone]ã«event.stopPropagation()
ãè¿œå ãããšãç§ã®å Žåã®åé¡ãä¿®æ£ãããŸãã ããããšã@vileppanen
ãã®ã¹ã¬ããã¯ç§ã®åœãæã£ã
<Dropzone />
ãreact-dnd
ã³ã³ããŒãã³ãå
ã«ãããã®åé¡ãçºçããŠããå Žåã¯ãåã解決çãæ©èœããŸã- <Dropzone />
ã<div onDragOver={e=> e.stopPropagation() />
ã§onDragOver
ã©ããããŸãäŒæãåæ¢ããããã«äœ¿çšãããŸãã
æãåèã«ãªãã³ã¡ã³ã
ãããåé¡ã§ãïŒ https ïŒ
ã³ãŒãã®ã³ã¡ã³ããçŽ æµãªã«ãŒãœã«ã衚瀺ããªãã§ãã ãããã«åºã¥ããšã
e.dataTransfer.dropEffect
ãåãªã衚瀺ããããã£ãšããŠæ±ã£ãŠããããã§ãã ãã ããdropEffectãnone
ã«èšå®ãããšãå®éã«ã¯ãã¡ã€ã«ããã¹ãŠäžç·ã«ãããããããã®ãé²ãããã«èŠããŸããmove
ãcopy
ããŸãã¯link
èšå®ãããšåé¡ãªãæ©èœããããšã«æ³šæããŠãã ããã ããã¯Chrome55.0.2ã«ãããŸããå®éã«ã¯ãreact-dndã®å€éšã§ããããã¹ãŠäžç·ã«è€è£œã§ããŸãã åé¡ãåãåãããã£ãã«ãäœæããŸããïŒ https ïŒ
dropEffectã®
effectAllowed
ãæ©èœããŠããã®ã«å¯ŸããdropEffect
ã¯ãã¬ãŒã³ããŒã·ã§ã³ã§ããç·šéïŒããã¯https://github.com/gaearon/react-dnd-html5-backend/issues/25ãšåãåé¡ã§ã