【发布时间】:2020-04-06 05:58:57
【问题描述】:
我尝试在选择文件后在 FileWidgetDropzone 上使用 FileReader。
我使用带有 onLoadCallback 的函数:
const readFile = (file: any, onLoadCallback: any) => {
var reader = new FileReader();
reader.onload = onLoadCallback;
reader.readAsArrayBuffer(file);
};
我使用 State 来存储 onLoadCallback 函数的结果数据(fileMetadata):
const [loadedFileReader, setLoadFileReader] = useState(false);
const [fileMetadata, setFileMetadata] = useState<IFileMetadata>(
new FileMetadataValues()
);
const [files, setFiles] = useState<any[]>([]);
使用 readFile 并在 onLoadCallback 中更新状态的函数:
const getFileExif = (file: any) => {
setLoadFileReader(true);
readFile(file, function(e: any) {
const data = ... e.target.result;
if (data) {
var model = new FileMetadataValues();
...
setFileMetadata(model);
setLoadFileReader(false);
}
}
});
};
使用效果获取额外的文件数据
useEffect(() => {
if (files.length >0 && !loadedFileReader) {
getFileExif(files[0]);
return () => {
files.forEach(file => URL.revokeObjectURL(file.preview));
};
}
}, [files]);
return (
<div>
<FileWidgetDropzone
...
该组件每次都重新渲染,然后从 getFileExif 函数调用状态更改(总共 4 次)。
当我在返回之前放置 debugger;渲染。
请帮助为此示例开发更有效的解决方案。
【问题讨论】:
标签: reactjs react-hooks filereader use-effect