【问题标题】:React.js file upload UI drag and drop not workingReact.js文件上传UI拖放不起作用
【发布时间】:2026-01-29 22:45:01
【问题描述】:

我正在尝试为我的 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>
    )
}

【问题讨论】:

    标签: javascript reactjs input drag-and-drop dom-events


    【解决方案1】:

    显然我没有 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);
            };
          });
    
    
    
    

    【讨论】:

      【解决方案2】:

      如果您使用箭头函数,则不需要附加事件侦听器。使用下面的代码所有事件都可以工作,我在上面的代码中看到的唯一问题是将隐藏输入上的事件附加到最外层的 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>
        );
      }
      

      【讨论】:

      • 你是对的。这确实有效。也许隐藏字段中的这个参考实际上是问题所在。我会做更多的测试
      最近更新 更多