希望您能帮到我,我正在使用react-dropzone中的useDropzone挂钩,而且我不知道如何为每个文件创建一个删除文件按钮。
如何删除单个文件?
这是我的代码:
function DragFile(props) {
const { acceptedFiles, rejectedFiles, getRootProps, getInputProps } = useDropzone({
accept: 'image/jpeg, image/png, .pdf',
maxSize: 3000000,
multiple: true
});
const acceptedFilesItems = acceptedFiles.map(file => (
<Col xs={12} md={4} key={file.path} className="card-file">
<div className="file-extension">{file.path.substring(file.path.indexOf('.') + 1)}</div>
<span>{file.path.substring(0, file.path.indexOf('.'))} <small>{(file.size / 1000).toFixed(2)} Kb</small></span>
<button className="delete">DeleteButton</button>
</Col>
));
const rejectedFilesItems = rejectedFiles.map(file => (
<li key={file.path}>
{file.path.substring(0, file.path.indexOf('.'))} - {file.size / 1000} Kb
</li>
));
return (
<div>
<div {...getRootProps({ className: 'dropzone drag-n-drop' })}>
<input id="file-claim" {...getInputProps()} />
<img src={uploadSrc} alt="Subir archivo" />
<p>Drag files here (PDF, JPG, PNG).</p>
</div>
<Row className="accepted-files">
{acceptedFilesItems}
</Row>
</div>
);
}
export default DragFile;
答案 0 :(得分:0)
放下文件时,将数据添加到您的状态,它应该使您能够访问数据以便删除。
大致:
onDrop = (files) => {
// use a foreach loop get the file name using Object.keys
// setState with the file names
// whatever else you need to do to process the file
}
handleDelete = () => {
// use the file names from your state to delete the files
}
在某个地方,您必须将其与jsx结合在一起。您还需要使其与发送到服务器的所有内容保持同步。应该全部用您的组件状态完成。
答案 1 :(得分:0)
您可能已经可以使用它了,但是您只需将其附加到点击处理程序上即可:
const remove = file => {
const newFiles = [...files]; // make a var for the new array
newFiles.splice(file, 1); // remove the file from the array
setFiles(newFiles); // update the state
};
并在地图中传递数字:acceptedFiles.map(file...
应为acceptedFiles.map((file, i)....
然后有<button type="button" onClick={() => remove(i)> DeleteButton</button>
,其中i
是数组中文件的编号。
答案 2 :(得分:0)
我希望这会对您有所帮助:
import React, { useState, useEffect, useCallback } from 'react'
import { useDropzone } from 'react-dropzone'
const CreateFileUpload = () => {
const onDrop = useCallback(acceptedFiles => {
// Do something with the files
}, [])
const { getRootProps, getInputProps, isDragActive, acceptedFiles } = useDropzone({ onDrop, accept: '.png, .jpeg' })
const files = acceptedFiles.map((file, i) => (
<li key={file.path} className="selected-file-item">
{file.path} <i className="fa fa-trash text-red" onClick={() => remove(i)}></i>
</li>
));
const remove = file => {
const newFiles = [...files]; // make a var for the new array
acceptedFiles.splice(file, 1); // remove the file from the array
};
return (
<div>
<div {...getRootProps()} className="dropzone-main">
<div
className="ntc-start-files-dropzone"
aria-disabled="false"
>
</div>
<button className="add-button" type="button">
<i className="fa fa-plus"></i>
</button>
<h3 className="upload-title">
<span></span>
</h3>
<input
type="file"
multiple=""
autocomplete="off"
className="inp-file"
// onChange={uploadFile}
multiple
{...getInputProps()}
/>
{isDragActive ?
<div></div>
:
<div>
<p> Upload files </p>
</div>
}
</div>
<aside>
{files.length > 0 ? <h5>Selected Files</h5> : <h5></h5>}
<ul>{files}</ul>
</aside>
</div>
)
}
export default CreateFileUpload