使用 react dropzone 显示文件名
Display file name using react dropzone
我正在尝试显示我将上传的文件列表。我使用 react-dropzone 库来拖放文件。使用 useState 挂钩
删除的文件未存储在文件数组中
import React, { useState, Fragment } from "react";
import { useDropzone } from "react-dropzone";
import "./App.css";
export default function App() {
const [files, setFiles] = useState([]);
const onDrop = acceptedFiles => {
setFiles(
acceptedFiles.map(file => {
return files.concat(file);
})
);
};
const { getRootProps, getInputProps } = useDropzone({ onDrop });
return (
<Fragment>
<div {...getRootProps()} className="input-area">
{
<div>
<p className="input-text">Drop the files here ...</p>
</div>
}
<input {...getInputProps()} />
</div>
<div>
Files :
{
files.map(file => <div>{file.path} </div>)
}
</div>
</Fragment>
);
}
这是相同的代码和框 link
https://codesandbox.io/s/hungry-margulis-ehgg2?file=/src/App.js:0-801
那是因为你用错了useState Hook。
如果你想将一些东西连接到一个状态,你应该使用 setFiles 的功能参数。
你可以这样做:
const onDrop = acceptedFiles => {
setFiles(files => files.concat(...acceptedFiles));
};
否则您可以执行以下操作:
const onDrop = useCallback(acceptedFiles => {
setFiles(files.concat(...acceptedFiles));
}, [files]);
useCallback Hook 将文件状态作为依赖项,如果该数组发生变化,该方法将从缓存中失效 :)
但我更喜欢第一个例子,因为你总是必须纠正状态的功能!
看这里:
看看这个,我在下面添加了评论并解决了你的问题:
https://codesandbox.io/s/dry-wave-457ee?file=/src/App.js
import React, { useCallback, useState, Fragment } from "react";
import { useDropzone } from "react-dropzone";
import "./App.css";
export default function App() {
const [files, setFiles] = useState([]);
const onDrop = acceptedFiles => {
console.log(acceptedFiles);
const allFiles = [...files, ...acceptedFiles]; //save all files here
console.log(allFiles);
setFiles(allFiles);
};
const { getRootProps, getInputProps } = useDropzone({ onDrop });
return (
<Fragment>
<div {...getRootProps()} className="input-area">
{
<div>
<p className="input-text">Drop the files here ...</p>
<p> drop next file here </p>
</div>
}
<input {...getInputProps()} />
</div>
<div>
Files :
{files.map(file => (
<li>{file.path}</li>
))}
</div>
</Fragment>
);
}
我正在尝试显示我将上传的文件列表。我使用 react-dropzone 库来拖放文件。使用 useState 挂钩
删除的文件未存储在文件数组中import React, { useState, Fragment } from "react";
import { useDropzone } from "react-dropzone";
import "./App.css";
export default function App() {
const [files, setFiles] = useState([]);
const onDrop = acceptedFiles => {
setFiles(
acceptedFiles.map(file => {
return files.concat(file);
})
);
};
const { getRootProps, getInputProps } = useDropzone({ onDrop });
return (
<Fragment>
<div {...getRootProps()} className="input-area">
{
<div>
<p className="input-text">Drop the files here ...</p>
</div>
}
<input {...getInputProps()} />
</div>
<div>
Files :
{
files.map(file => <div>{file.path} </div>)
}
</div>
</Fragment>
);
}
这是相同的代码和框 link https://codesandbox.io/s/hungry-margulis-ehgg2?file=/src/App.js:0-801
那是因为你用错了useState Hook。 如果你想将一些东西连接到一个状态,你应该使用 setFiles 的功能参数。 你可以这样做:
const onDrop = acceptedFiles => {
setFiles(files => files.concat(...acceptedFiles));
};
否则您可以执行以下操作:
const onDrop = useCallback(acceptedFiles => {
setFiles(files.concat(...acceptedFiles));
}, [files]);
useCallback Hook 将文件状态作为依赖项,如果该数组发生变化,该方法将从缓存中失效 :) 但我更喜欢第一个例子,因为你总是必须纠正状态的功能!
看这里:
看看这个,我在下面添加了评论并解决了你的问题: https://codesandbox.io/s/dry-wave-457ee?file=/src/App.js
import React, { useCallback, useState, Fragment } from "react";
import { useDropzone } from "react-dropzone";
import "./App.css";
export default function App() {
const [files, setFiles] = useState([]);
const onDrop = acceptedFiles => {
console.log(acceptedFiles);
const allFiles = [...files, ...acceptedFiles]; //save all files here
console.log(allFiles);
setFiles(allFiles);
};
const { getRootProps, getInputProps } = useDropzone({ onDrop });
return (
<Fragment>
<div {...getRootProps()} className="input-area">
{
<div>
<p className="input-text">Drop the files here ...</p>
<p> drop next file here </p>
</div>
}
<input {...getInputProps()} />
</div>
<div>
Files :
{files.map(file => (
<li>{file.path}</li>
))}
</div>
</Fragment>
);
}