javascript - react-dropzone - 访问通过单击添加的文件不删除
问题描述
我正在使用 react-dropzone 基本示例(react-dropzone basic)
import React from 'react';
import {useDropzone} from 'react-dropzone';
function Basic(props) {
const {acceptedFiles, getRootProps, getInputProps} = useDropzone();
const files = acceptedFiles.map(file => (
<li key={file.path}>
{file.path} - {file.size} bytes
</li>
));
return (
<section className="container">
<div {...getRootProps({className: 'dropzone'})}>
<input {...getInputProps()} />
<p>Drag 'n' drop some files here, or click to select files</p>
</div>
<aside>
<h4>Files</h4>
<ul>{files}</ul>
</aside>
</section>
);
}
<Basic />
这按预期工作,直到我使用 click 方法添加文件。使用单击添加文件时,acceptedFiles
不要注册文件(我添加了一个 onChange 处理程序,并且 event.target.files 显示了该文件,因此它肯定会被添加到整体中FileList
)。
因此,我无法Files <ul>
像在拖动文件中那样显示通过单击详细信息添加的文件。我认为这也是如此,fileRejections
但我还没有实现它。
我希望我遗漏了一些明显的东西,因为我认为 dropzone 可以同时处理拖动和单击行为?
如果可能的话,感谢有人指出我正确的方向。
解决方案
上面的代码处理拖放,但它只为您提供最新添加的文件,而不是上传文件的整个列表。
要正确实现它,您可以维护一个状态并向 useDropzone 添加一个 onDrop 函数,您将在其中附加文件并更新状态
function Basic(props) {
const [files, setFiles] = React.useState([]);
const onDrop = React.useCallback(acceptedFiles => {
setFiles(prev => [...prev, ...acceptedFiles]);
}, []);
const { getRootProps, getInputProps } = useDropzone({ onDrop });
const fileList = files.map(file => (
<li key={file.path}>
{file.path} - {file.size} bytes
</li>
));
return (
<section className="container">
<div {...getRootProps({ className: "dropzone" })}>
<input {...getInputProps()} />
<p>Drag 'n' drop some files here, or click to select files</p>
</div>
<aside>
<h4>Files</h4>
<ul>{fileList}</ul>
</aside>
</section>
);
}
推荐阅读
- c# - 实体框架核心——“如果不存在则插入”可能吗?
- android - Android:如何使用 NotificationChannel 创建永久通知
- azure - 如何在 C# 代码中从 am gremlinquery 获取单个值
- html - 如何调整复选框周围的点击区域?
- json - POST json 到 WCF 服务返回(400 BAD 请求)
- reactjs - 是否有可能在不更改道具和状态的情况下重新渲染组件
- c# - 如何在 C# 中实现数学 sigma & pi 符号?
- android - 如果我们不知道开始版本,则进行房间迁移
- java - 在 Mybatis 中使用 GET_WKT() 返回 null 值
- javascript - Serverworker 似乎使 ajax 请求非常慢