9月 06, 2019 React
### 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 (
			
			
); ] } ```
過去文章
2025 (9)
4 (5)
3 (1)
2 (3)
2024 (25)
11 (3)
10 (3)
9 (1)
3 (18)
2022 (6)
10 (1)
6 (2)
5 (1)
3 (1)
1 (1)
2021 (21)
11 (7)
7 (1)
6 (2)
5 (2)
4 (6)
3 (2)
2 (1)
2020 (92)
12 (1)
11 (2)
10 (4)
9 (10)
8 (5)
7 (1)
6 (3)
5 (1)
4 (4)
3 (25)
2 (7)
1 (29)
2019 (57)
12 (25)
11 (7)
9 (25)