【问题标题】:File is replacing file, not adding in React (Next.js)文件正在替换文件,而不是在 React (Next.js) 中添加
【发布时间】:2022-01-25 06:19:24
【问题描述】:

请先检查我的代码。

const test = () => {

const [files, setFiles] = useState ([]);

//I think I have to edit following statement.

const handleFile = (e) => {
   const newFiles = []
   for (let i=0; i < e.target.files.length; i++) {
       newFiles.push(e.target.files[i])
    }
        setFiles(newFiles)
};

return (

   {files.map((file, index) => (
     <div>
       <div key={index}>
         <p>
         {file.name}
         </p>
         <Button size='small' onClick={() => {deleteSelectedFile(file.name)}}>
         Delete
         </Button>
       </div>
     </div>
    ))}

    <div>
        <label onChange={handleFile}>
            <input type='file' multiple />+ Attach File
        </label>
    </div>

)

}

通过handleFile语句,我可以适当的获取文件。

但是,当我一次上传一个文件,然后再次上传一个文件时,

文件未添加。文件替换文件。

一次上传多次没有问题。

例如,我上传了“hello.jpg”,它在屏幕上呈现得很好。然后,我上传了'goodbye.jpg',它渲染得很好,但是'goodbye.jpg'替换了'hello.jpg'。

因此,我看到的只是 'goodbye.jpg' [按钮],而不是

'hello.jpg' [按钮] 'goodbye.jpg' [按钮]

.

我希望我的文件堆叠起来,而不是替换。

我需要一些智慧!

【问题讨论】:

    标签: javascript reactjs file next.js


    【解决方案1】:

    你不为新文件创建一个新变量怎么样,你只是为文件设置状态,因为它是一个数组

    setFiles(oldFile => [...oldFile,e.target.files[i]]);
    

    如果可能,您可以删除 codepen 链接

    【讨论】:

    • 非常感谢。我学到了很多。我从来没有想过这样的方式。
    • 当然,不客气
    【解决方案2】:

    在我看来,您只需要在更改事件期间传播 prev 状态值和文件。

    import { useState } from "react";
    
    export default function App() {
      const [files, setFiles] = useState([]);
    
      const handleChange = (e) => {
        // This is what you need
        setFiles((prev) => [...prev, ...Object.values(e.target.files)]);
      };
    
      return (
        <div>
          <label onChange={handleChange}>
            <input type="file" multiple />
          </label>
          {files.map((file) => {
            return <p>{file.name}</p>;
          })}
        </div>
      );
    }
    

    【讨论】:

    • 哇。这很好用。你能告诉我更多你的陈述是如何运作的吗?我完全迷路了,但很高兴它有效。非常感谢!
    • 您可以使用 setState 函数内部的函数来获取当前状态值并返回您想要替换状态的任何内容。你在这里想要的是状态的当前值+你添加的值。所以,你只需要返回合并的数组 => [prev, current]
    猜你喜欢
    • 1970-01-01
    • 2021-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-21
    • 2013-08-26
    • 1970-01-01
    相关资源
    最近更新 更多