Javascript React.js文件上载UI拖放不工作

Javascript React.js文件上载UI拖放不工作,javascript,reactjs,input,drag-and-drop,dom-events,Javascript,Reactjs,Input,Drag And Drop,Dom Events,我正在尝试为我的react.js应用程序编写文件上载。但是,我无法使拖放区域正常工作。 即使我停止传播并防止拖放事件的默认值,它仍然无法按预期工作。浏览器仍然会打开我的文件 export default function DraggableUploader() { const fileInput = useRef(null) const [loadedFile, setLoadedFile] = useState(null) const [isLoading, setI

我正在尝试为我的react.js应用程序编写文件上载。但是,我无法使拖放区域正常工作。 即使我停止传播并防止拖放事件的默认值,它仍然无法按预期工作。浏览器仍然会打开我的文件

export default function DraggableUploader() {

    const fileInput = useRef(null)
    const [loadedFile, setLoadedFile] = useState(null)
    const [isLoading, setIsLoading] = useState(false)

    const handleDragEnter = e => {
        e.preventDefault();
        e.stopPropagation();
      };
    const handleDragLeave = e => {
        e.preventDefault();
        e.stopPropagation();
    };
    const handleDragOver = e => {
        e.preventDefault();
        e.stopPropagation();
    };
    const handleDrop = e => {
        e.preventDefault();
        e.stopPropagation();

    };


    function handleSubmit(e) {
        e.preventDefault()
        console.log(`current file`, loadedFile.name)



    }

    return (
        <div className="dropzone">
            <div className="sub-header">Drag your audio file here:</div>
            <div className="draggable-container">
                <input 
                    type="file" 
                    className="file-browser-input"
                    name="file-browser-input"
                    style={{display: "none"}}
                    ref={fileInput} 
                    onDrop={e => handleDrop(e)}
                    onDragOver={e => handleDragOver(e)}
                    onDragEnter={e => handleDragEnter(e)}
                    onDragLeave={e => handleDragLeave(e)}
                    onChange={handleInputChange}  
                />


                <div className="file-browser-container">
                    <Button variant="outline-primary" onClick={handleInputClick}>Browse</Button>

                </div>

            </div>
            <Button variant="primary" onClick={handleSubmit}>Submit</Button>
        </div>
    )
}

显然,我没有添加事件侦听器的useEffect。。如果您添加以下代码,则所有操作均按预期进行:

useEffect(() => {
        let div = dropRef.current;
        div.addEventListener('dragenter', handleDragEnter);
        div.addEventListener('dragleave', handleDragLeave);
        div.addEventListener('dragover', handleDragOver);
        div.addEventListener('drop', handleDrop);
        return function cleanup() {
          div.removeEventListener('dragenter', handleDragEnter);
          div.removeEventListener('dragleave', handleDragLeave);
          div.removeEventListener('dragover', handleDragOver);
          div.removeEventListener('drop', handleDrop);
        };
      });




显然,我没有添加事件侦听器的useEffect。。如果您添加以下代码,则所有操作均按预期进行:

useEffect(() => {
        let div = dropRef.current;
        div.addEventListener('dragenter', handleDragEnter);
        div.addEventListener('dragleave', handleDragLeave);
        div.addEventListener('dragover', handleDragOver);
        div.addEventListener('drop', handleDrop);
        return function cleanup() {
          div.removeEventListener('dragenter', handleDragEnter);
          div.removeEventListener('dragleave', handleDragLeave);
          div.removeEventListener('dragover', handleDragOver);
          div.removeEventListener('drop', handleDrop);
        };
      });




如果使用arrow函数,则不需要附加事件侦听器。使用下面的代码所有事件都可以工作我在上面的代码中看到的唯一问题是在隐藏的输入上附加事件将事件附加到最外层的div它可以工作。祝你好运

export default function App() {

  const handleDragEnter = e => {
    e.preventDefault();
    console.log("drag enter");
  };

  const handleDragLeave = e => {
    e.preventDefault();
    console.log("drag leave");
  };

  const handleDragOver = e => {
    e.preventDefault();
    console.log("drag over");
  };

  const handleDrop = e => {
    e.preventDefault();
    console.log("drag drop");
  };

  const handleInputChange = () => {};

  return (
    <div
      className="dropzone"
      onDrop={e => handleDrop(e)}
      onDragOver={e => handleDragOver(e)}
      onDragEnter={e => handleDragEnter(e)}
      onDragLeave={e => handleDragLeave(e)}
      onChange={handleInputChange}
    >
      <div className="sub-header">Drag your audio file here:</div>
      <div className="draggable-container">
        <input
          type="file"
          className="file-browser-input"
          name="file-browser-input"
          style={{ display: "none" }}
        />
      </div>
    </div>
  );
}

如果使用arrow函数,则不需要附加事件侦听器。使用下面的代码所有事件都可以工作我在上面的代码中看到的唯一问题是在隐藏的输入上附加事件将事件附加到最外层的div它可以工作。祝你好运

export default function App() {

  const handleDragEnter = e => {
    e.preventDefault();
    console.log("drag enter");
  };

  const handleDragLeave = e => {
    e.preventDefault();
    console.log("drag leave");
  };

  const handleDragOver = e => {
    e.preventDefault();
    console.log("drag over");
  };

  const handleDrop = e => {
    e.preventDefault();
    console.log("drag drop");
  };

  const handleInputChange = () => {};

  return (
    <div
      className="dropzone"
      onDrop={e => handleDrop(e)}
      onDragOver={e => handleDragOver(e)}
      onDragEnter={e => handleDragEnter(e)}
      onDragLeave={e => handleDragLeave(e)}
      onChange={handleInputChange}
    >
      <div className="sub-header">Drag your audio file here:</div>
      <div className="draggable-container">
        <input
          type="file"
          className="file-browser-input"
          name="file-browser-input"
          style={{ display: "none" }}
        />
      </div>
    </div>
  );
}

你是对的。这确实有效。也许隐藏字段中的这个ref实际上就是问题所在。我会做更多的测试你是对的。这确实有效。也许隐藏字段中的这个ref实际上就是问题所在。我会做更多的测试