反应onDrop没有开火

Psb*_*Psb 14 typescript reactjs

下面是我正在尝试使用的示例代码,即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>)
  }
}
Run Code Online (Sandbox Code Playgroud)

Psb*_*Psb 32

最后我得到了这个问题,由于某种原因我必须像这样处理onDragOver:

onDragOver = (e) => {
let event = e as Event;
event.stopPropagation();
event.preventDefault();
}
Run Code Online (Sandbox Code Playgroud)

这解决了我的问题.

  • 它不是React中的错误,它是拖放事件的工作方式.[dragOver](https://developer.mozilla.org/en-US/docs/Web/Events/dragover)的默认操作是"将当前拖动操作重置为无".所以除非你取消它,否则掉落不起作用.查看[MDN](https://developer.mozilla.org/en-US/docs/Web/Events/drop)了解更多信息.他们的例子包括这一点. (6认同)
  • 有同样的问题,这解决了问题。我不知道,但这看起来像是反应中的错误。对于本地事件,则无需执行此类操作。 (2认同)

Jam*_*Yin 7

只需阻止默认的ondragover事件即可。

onDragOver = (event) => {
    event.preventDefault();
}
Run Code Online (Sandbox Code Playgroud)
return (<div onDragOver={this.onDragOver} {...others}>{children}</div>);
Run Code Online (Sandbox Code Playgroud)


小智 5

您的代码中有一个问题,您必须将事件分配给 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>
    )
  }
Run Code Online (Sandbox Code Playgroud)