【问题标题】:Drag and drop area with react-dnd使用 react-dnd 拖放区域
【发布时间】:2020-11-02 14:53:25
【问题描述】:

我正在尝试创建一个拖放区域以上传单个图片,并且我想使用函数onDrop 将其传递到 base64 编码 URL 中的应用程序状态。

import React from "react";
import {useDrop} from 'react-dnd'


export default function MyDropTarget(props) {
    const [drop] = useDrop({
        accept: "box",
        collect: (monitor) => {
                const res = monitor.getItem();
                if (res && res.files) {
                    const reader = new FileReader();
                    reader.onloadend = () => props.onDrop(reader.result);
                    reader.readAsDataURL(res.files[0]);
                }
        },

    });
    return (
        <div ref={drop}>
            Drag item here
        </div>);
};

这就是我使用这个组件的方式:

<DndProvider backend={HTML5Backend}>
  <MyDropTarget style={{height: "100px", width: "100px"}} onDrop={updateImage}/>
</DndProvider>

由于我是react-dnd 的新手,我遇到了一些问题。我收到了这样的错误TypeError: Failed to execute 'readAsDataURL' on 'FileReader': parameter 1 is not of type 'Blob'.
我想我没有正确理解monitor.getItem() 的结构,如果有任何解决方法的提示,我将不胜感激。

【问题讨论】:

    标签: javascript reactjs file-upload react-dnd base64url


    【解决方案1】:

    我的猜测是您需要确保res.files[0] 有一个值(不是undefinednull)。

     if(res.files[0]){
      reader.readAsDataURL(res.files[0]);
     }
    

    如果没有帮助,您也可以尝试检查 res.files[0] 的类型。

    【讨论】:

    • 奇怪的是,如果我添加 if (res &amp;&amp; res.files[0])它根本不会进入 if 块
    • 这有点暗示res.files[0]undefinednull(假设以前,在res &amp;&amp; res.files 条件下它确实进入了if 块)。您能否提供一个沙盒示例,以便我们对其进行测试?
    • 你也可以尝试在 if 语句之前输出res.files[0] 并验证它是否真的有任何值。
    • res.files[0] 未定义。我什至不知道在这种情况下该怎么做以及上传的文件存储在哪里。
    • 根据文档,monitor.getItem() 在拖动组件中获取通过endDrag 传递的项目。由于情况有点不同,我宁愿建议使用Dropzone.js (github.com/react-dropzone/react-dropzone)。它似乎完全符合您的要求,在使用示例中,您会发现文件上传。希望这会有所帮助:)
    猜你喜欢
    • 2019-03-19
    • 2020-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多