为了账号安全,请及时绑定邮箱和手机立即绑定

从本地硬盘读取 JSON 文件并解析为 react 应用程序

从本地硬盘读取 JSON 文件并解析为 react 应用程序

梵蒂冈之花 2021-11-18 09:33:04
我正在尝试从用户选择或拖放的硬盘驱动器中读取 JSON 文件。我有点不确定它应该如何工作,而且我认为 FileReader.readAsText 是异步的这一事实存在问题。无论如何,制作了一个工作正常的拖放区组件,用户也可以选择一个文件。这是我的代码的相关部分: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 中设置调试器语句,我可以看到正在读取的文件的内容。为什么我无法获取文件的内容?
查看完整描述

2 回答

?
繁星coding

TA贡献1797条经验 获得超4个赞

输入错误:


const [parsedFile, setParsedFile] = useState(null);

文件阅读器代码:


const fileReader = new FileReader();


fileReader.readAsText(e.dataTransfer.files[0]);


fileReader.onload = () => {

  setParsedFile(fileReader.result);

};


查看完整回答
反对 回复 2021-11-18
?
慕桂英3389331

TA贡献2036条经验 获得超8个赞

您正在尝试打印parsedFile,但在该状态下被调用parsedFiled。您还在onload回调设置状态之前打印值。尝试将打印移动到回调函数中。

onload回调函数是asyncronous,所以你不能调用它,因为没有保证该功能已得到解决后,立即使用的值。为了使用文件内容,您可以执行以下操作之一: 将相关代码放在渲染函数中,以便它可以对状态变化做出反应;编写代码并插入回调函数中,以便在内容可用时调用;使用同步读取函数或将异步函数包装在承诺中,这样您就可以对它如何解决有预期(例如await承诺并在之后立即使用内容)。


查看完整回答
反对 回复 2021-11-18
  • 2 回答
  • 0 关注
  • 201 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信