Я пытаюсь прочитать файл JSON с жесткого диска, который был выбран пользователем или перетащен. Я немного не уверен, как это должно работать, и я думаю, что у меня проблема с тем, что FileReader.readAsText является асинхронным. В любом случае, сделал компонент Drop Zone, который отлично работает, и пользователи также могут выбрать файл. Вот соответствующие части моего кода:
const DropZone = () => {
const [files, setFiles] = useState([]);
const [parsedFile, setParsedFile] = useState(null);
const onDrop = async (e) => {
e.preventDefault();
if (disabled) return;
setFiles([...e.dataTransfer.files]);
const fileReader = new FileReader();
await fileReader.readAsText(e.dataTransfer.files[0]);
fileReader.onload = (e) => {
setParsedFile(JSON.parse(e.target.result));
};
// e.dataTransfer.clearData();
// setDragging(false);
};
const renderHasFiles = () => {
// console.log('files: ', files);
return (
<Fragment>
<StyledIcon iconName="cloud_done" size="extraLarge" color={alertColors.SUCCESS} />
<div>Got em!</div>
<FileList>
<FileListHeader>
<TableHeader>File Name</TableHeader>
<TableHeader align="right">Size</TableHeader>
</FileListHeader>
<FileListContent>
{renderFileList()}
</FileListContent>
</FileList>
<ButtonContainer>
<ClearButton onClick={(e) => {e.preventDefault(); e.stopPropagation(); setFiles([]);}}>
Clear Files
</ClearButton>
<StyledButton onClick={(e) => { e.preventDefault(); e.stopPropagation(); submitButtonCallback(files, parsedFile); }}>
{submitButtonText}
</StyledButton>
</ButtonContainer>
</Fragment>
);
};
return (
<DropZoneContainer
width={width}
height={height}
disabled={disabled}
dragging={dragging}
onClick={() => openFileDialog()}
onDragOver={(e) => onDragOver(e)}
onDrop={(e) => onDrop(e)}
>
{files.length === 0 ? renderNoFiles() : renderHasFiles()}
</DropZoneContainer>
);
};
Журнал консоли parsedFile равен нулю, но если я задаю оператор отладчика в onload, я могу видеть содержимое читаемого файла. Почему я не могу достать содержимое файла?