【问题标题】:React Mui-Dropzone Using multiple Dropzone on the same page在同一页面上使用多个 Dropzone 反应 Mui-Dropzone
【发布时间】:2020-06-28 07:15:22
【问题描述】:

我正在尝试使用带有 Mui-dropzone 的 React 来处理文件上传。我想在一页中使用多个 Dropzone 组件。我尝试将文件保存在状态(嵌套对象)中,但文件始终保存在我的最后一个状态,刚刚发生了什么?以及如何独立于每个状态存储每个文件?

const [data, setData] = useState({
    firstFile: [],
    secondFile: []
  });

  const [isOpen, setIsOpen] = useState(false);

  function handleDialog() {
    setIsOpen(!isOpen);
  }

  function onSaveFirstFile(file) {
    setData(prevState => ({
      ...data,
      firstFile: [...prevState.firstFile, file]
    }))
    setIsOpen(false);
  }

  function onSaveSecondFile(file) {
    setData(prevState => ({
      ...data,
      secondFile: [...prevState.secondFile, file]
    }))
    setIsOpen(false);
  }

  function showState() {
    console.log(data)
  }

  return (
    <div className="App">
{/* ------------------------------
 --------First Dropzone 
 ------------------------------ */}

      <Link classes={{ root: classes.linkRoot }} onClick={handleDialog}>
        <Typography variant="body2">Upload first File</Typography>
      </Link>
      <DropzoneArea
        dropzoneClass={classes.dropZoneRoot}
      />
      <DropzoneDialog
        open={isOpen}
        acceptedFiles={["image/jpeg", "image/png", "image/bmp"]}
        showPreviews={true}
        maxFileSize={5000000}
        showFileNamesInPreview={true}
        onDelete={deleteFileObj => {
          console.log("OnDelete", deleteFileObj);
        }}
        onClose={() => {
          console.log("OnClose : ", data);
          setIsOpen(false);
        }}
        onSave={onSaveFirstFile}
      />
      <br />

 {/* ------------------------------
 --------Second Dropzone 
 ------------------------------ */}
      <Link classes={{ root: classes.linkRoot }} onClick={handleDialog}>
        <Typography variant="body2">Upload second File</Typography>
      </Link>
      <DropzoneArea
        dropzoneClass={classes.dropZoneRoot}
      />
      <DropzoneDialog
        open={isOpen}
        acceptedFiles={["image/jpeg", "image/png", "image/bmp"]}
        showPreviews={true}
        maxFileSize={5000000}
        showFileNamesInPreview={true}
        onDelete={deleteFileObj => {
          console.log("OnDelete", deleteFileObj);
        }}
        onClose={() => {
          console.log("OnClose : ", data);
          setIsOpen(false);
        }}
        onSave={onSaveSecondFile}
      />
      <br />
      <button onClick={showState}>Show State!</button>
    </div>

这是我在第一个 Dropzone 上上传文件后在控制台中得到的(它以错误的状态保存,为什么?)
Object {firstFile: Array[0], secondFile: Array[1]}

注意:这是我的代码框:https://codesandbox.io/s/multiple-mui-dropzone-4fwlb

【问题讨论】:

    标签: reactjs dropzone


    【解决方案1】:
      function handleDialog() {
        setIsOpen(!isOpen);
      }
    

    DropzoneDialog 都通过此函数打开。当您单击其中一个时,您在两者上都设置了open={true}。您的文件总是上传到secondFile 数组,因为您的第一个 DropZone 总是隐藏在第二个之后。

    【讨论】:

    • 对不起,你的意思是我应该使用不同的状态来控制对话框的每个状态?
    • 这取决于你。您的状态可以是字符串(或数字),而不是布尔值,然后是类似于 open={myState === /* some value */} 的内容。无论哪种方式,您都需要确保不要同时打开两个对话框。在任何给定时间,只有一个 open 属性应评估为真实值。
    猜你喜欢
    • 2014-12-26
    • 1970-01-01
    • 1970-01-01
    • 2019-04-17
    • 2015-08-29
    • 1970-01-01
    • 2018-12-04
    • 2019-03-15
    • 2021-06-03
    相关资源
    最近更新 更多