### What is Drag and Drop?
Drag and drop is a event to handle user mouse action. Drag any thing into an area (e.g. `<div>`) will fire appropriate events.
There are 4 events you have to handle:
1. dragenter
2. dragleave
3. dragover
4. drop
### Event: dragenter
This event will file when user drag anythings into the target area. Only fire when entering the DOMElement.
### Event: dragleave
This event will file when user drag anythings out the target area. Only fire once when leaving the DOMElement.
### Event: dragover
This event will file when user drag anythings onto the target area. Event will keep firing when mouse dragged something and moving over the target area.
### Event: drop
This event will file when user drop anythings into the target area. Only fire once when dragging items dropped into the DOMElement.
### Add event listener to DOMElement
The following code shows how to add event listeners to those events:
```js
var div = document.getElementById('my-div');
div.addEventListener('dragenter', evt => {
// do something
});
div.addEventListener('dragleave', evt => {
// do something
});
div.addEventListener('dragover', evt => {
// do something
});
div.addEventListener('drop', evt => {
// do something
});
```
The above sample is for standard javascript with jquery.
### Do in React way
In react, you may use `ref` to accomplish this.
```js
class YourDragAndDropComponent extends Component {
dropRef = React.createRef();
constructor(props) {
super(props);
this.state = {};
this.onDragEnter = this.onDragEnter.bind(this);
this.onDragLeave = this.onDragLeave.bind(this);
this.onDragOver = this.onDragOver.bind(this);
this.onDrop = this.onDrop.bind(this);
}
componentDidMount() {
const div = this.dropRef.current;
div.addEventListener('dragenter', this.onDragEnter);
div.addEventListener('dragleave', this.onDragLeave);
div.addEventListener('dragover', this.onDragOver);
div.addEventListener('drop', this.onDrop);
}
componentWillUnmount() {
const div = this.dropRef.current;
div.removeEventListener('dragenter', this.onDragEnter);
div.removeEventListener('dragleave', this.onDragLeave);
div.removeEventListener('dragover', this.onDragOver);
div.removeEventListener('drop', this.onDrop);
}
onDragEnter(event) {
// todo
}
onDragLeave(event) {
// todo
}
onDragOver(event) {
// todo
}
onDrop(event) {
// todo
}
render() {
return (
);
]
}
```