以下是我尝试使用的示例代码,即react + TypeScript。 onDragEnter和onDragOver正常工作但不是 onDrop 事件。
import * as React from 'react';
export class FileZone extends React.Component {
onDragOver = (e) => {
let event = e as Event;
event.stopPropagation();
}
onDragEnter = (e) => {
let event = e as Event;
event.stopPropagation();
}
onFileDrop = (e) => {
let event = e as Event;
event.stopPropagation();
console.log("onFileDrop");
alert("dropped")
}
render() {
return (
<div>
onDragEnter={this.onDragEnter}
onDragOver={this.onDragOver}
onDrop={this.onFileDrop}>
Drag and drop file here
</div>)
}
}
答案 0 :(得分:16)
最后我遇到了问题,出于某些原因我必须像这样处理 onDragOver :
onDragOver = (e) => {
let event = e as Event;
event.stopPropagation();
event.preventDefault();
}
这解决了我的问题。
答案 1 :(得分:5)
只需阻止默认的ondragover事件,它就会起作用。
onDragOver = (event) => {
event.preventDefault();
}
return (<div onDragOver={this.onDragOver} {...others}>{children}</div>);
答案 2 :(得分:4)
您的代码中存在问题,您必须将事件分配给div
render() {
return (
<div //you have to remove additional > from here
onDragEnter={this.onDragEnter}
onDragOver={this.onDragOver}
onDrop={this.onFileDrop}>
Drag and drop file here
</div>
)
}
答案 3 :(得分:1)
onDrop={files => this.onFileDrop}>
这应该成为:
onDrop={this.onFileDrop}>
当你使用'this。'来调用函数时,你需要它在构造函数中:
constructor(props) {
super(props);
this.onFileDrop = this.onFileDrop.bind(this);
}
功能:
onFileDrop(event) {
event.preventDefault();
console.log("qwerty")
}
答案 4 :(得分:0)
你需要调用函数来启动它(使用括号):
render() {
return (
<div>
onDragEnter={this.onDragEnter}
onDragOver={() => { return false }}
onDrop={files => this.onFileDrop()}> // you were missing the "()"
Drag and drop file here
</div>)
}
答案 5 :(得分:0)
window.ondragover = function(e) { e.preventDefault(); return false };
window.ondrop = function(e) { e.preventDefault(); return false };
答案 6 :(得分:0)
默认情况下,浏览器会阻止“放置”操作,因此您需要阻止它们执行此操作! event.preventDefault()将按您提到的进行处理。
答案 7 :(得分:0)
这是我工作的方式,可能是更好的方式。这可能会有一些我忽略的未知副作用,但是到目前为止,它似乎还可以正常工作。我正在App.js级别上执行此操作。
useEffect(() => {
const ondragover = window.ondragover;
const ondrop = window.ondrop;
window.ondragover = function (e) { e.preventDefault(); return false };
window.ondrop = function (e) { e.preventDefault(); return false };
return () => {
window.ondragover = ondragover;
window.ondrop = ondrop;
}
});
我在此答案https://stackoverflow.com/a/56034626/2031320中看到了这种技巧