score:0

as i cannot run your current reactjs application, i have pieced together a short example to show different instances of the drag and drop functionality.

as you can see by the example setting the draggable attribute to your element should make the element draggable, as it would look dragging an image on a typical webpage.

can you confirm that when dragging your element, it doesn't move at all as seen in the code snippet for the not draggable box?

var draggable = document.getelementbyid('draggable');

function ondragstart(event) {
    event.datatransfer.setdata('text/html', null); //cannot be empty string
    var counter = document.getelementbyid('counter');
    counter.innertext = parseint(counter.innertext, 10) + 1;
}

draggable.addeventlistener('dragstart', ondragstart, false);
#draggable{
    width: 100px;
    height: 100px;
    background: blue;
    margin: 10px 5px;
}

#notdraggable{
    width: 100px;
    height: 100px;
    background: red;
    margin: 10px 5px;
}

#draggablendt{
      width: 100px;
    height: 100px;
    background: green;
    margin: 10px 5px;
} 
   <div>draggable (<span id='counter'>0</span>)</div>
    <div id='draggable' draggable='true'></div>
    
    <div><pre>draggable (no datatransfer)</div>
    <div id='draggablendt' draggable></div>
    
    <div><pre>not draggable</div>
    <div id='notdraggable' draggable='false'></div>

score:0

you can checkout react-draggable library, just wrap component in draggable component

install npm i react-draggable

import import draggable from 'react-draggable'

usage:

<draggable 
   axis="both"
   cancel="input, textarea, span, label"
>
  <div style={mystyle}>test</div>
</draggable>

score:3

this can be a core implementation of the drag behaviour in react. it needs enhancements of course, plus does not handle dropping yet:

const { useref } = react

const app = () => {
  const elemref = useref(null)
  const dragprops = useref()
  
  const initialisedrag = event => {
    const { target, clientx, clienty } = event
    const { offsettop, offsetleft } = target
    const { left, top } = elemref.current.getboundingclientrect()
    
    dragprops.current = {
      dragstartleft: left - offsetleft,
      dragstarttop: top - offsettop,
      dragstartx: clientx,
      dragstarty: clienty
    }
    window.addeventlistener('mousemove', startdragging, false)
    window.addeventlistener('mouseup', stopdragging, false)
  }
  
  
  const startdragging = ({ clientx, clienty }) => {    
    elemref.current.style.transform = `translate(${dragprops.current.dragstartleft + clientx - dragprops.current.dragstartx}px, ${dragprops.current.dragstarttop + clienty - dragprops.current.dragstarty}px)`
  } 

  const stopdragging = () => {
    window.removeeventlistener('mousemove', startdragging, false)
    window.removeeventlistener('mouseup', stopdragging, false)
  }
  
  return (
    <div
      onmousedown={initialisedrag}
      ref={elemref}
      >
      dragme
    </div>
  )
}

reactdom.render(<app />, document.getelementbyid('root'));
div {
  cursor: grab;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.8.1/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.8.1/umd/react-dom.production.min.js"></script>
<div id="root"></div>


Related Query

More Query from same tag