当前位置: 首页 > 知识库问答 >
问题:

React setState不是添加JSON时的函数?

刁俊人
2023-03-14

我试图使用共享祖先在文件上传程序和表之间中继数据。我有一个文件上传程序,但一旦我添加了JSON文件,我就会收到错误TypeError:setProductState不是一个函数。

当我将inputJson文件记录到控制台中时,它会运行,但当我应用setProductState并输入我的文件时,我会收到此错误。

根据我所读到的,我不需要绑定,因为我使用箭头语法,但我可能需要一个“this”。

  • this.setState不是一个函数
  • 如何在回调中访问正确的'this'

欢迎提出任何想法或批评。

function FileUploader({ productState, setProductState }) {

  const onDrop = useCallback((acceptedFiles) => {
   // this.setProductState = this.setProductState.bind(this); tried
    acceptedFiles.forEach((file) => {
      const reader = new FileReader()
      reader.onload  = () => {
        const inputJson =
          this.inputJson = inputJson //tried
          JSON.parse(reader.result)
          setProductState(inputJson); //console.log goes through
        }
      reader.readAsText(file)
    })

  }, [])
  const {getRootProps, getInputProps} = useDropzone({onDrop})

  return (
    <div {...getRootProps({style})}>
      <input {...getInputProps()} value={productState}/>
      <p>Drag files here, or click to browse</p>
    </div>
  )
}

祖先.js

import React, { useState } from 'react'
import FileUploader from './FileUploader'
import Table from './Table'

const Ancestor = () => {
    const [products, setProducts] = useState({});
    return <>
      <FileUploader productState={products} setProductState={setProducts} />
      <Table productState={products} />
    </>;
  }

export default Ancestor;

共有1个答案

家浩瀚
2023-03-14

我相信您可能会对这个关键字的工作原理感到困惑。在FileUploader组件中,这将是对FileUploader的引用,而不是对祖先的引用。

您不需要引用Ancestor,因为您正在将产品setProducts作为道具传递。这才是正确的做法。

此外,您可能不打算在接受文件上做一个foreach,因为您似乎只需要一个文件,对吗?

试试这个。

function FileUploader(props) {
  // Define an onDrop function to handle drop events
  const onDrop = useCallback((acceptedFiles) => {
    // Get the first file in the list of acceptedFiles
    const file = acceptedFiles[0];

    // Create a FileReader
    const reader = new FileReader();

    // Create a function to handle the reader onload event
    reader.onload = () => {
      // JSON parse the result from read as text
      let parsed = JSON.parse(reader.result);
      // Call the setProductState function from Ancestor component
      props.setProductState(parsed);
    };

    // Read the file, triggering the onload event handler
    reader.readAsText(file);
  }, []);

  const { getRootProps, getInputProps } = useDropzone({ onDrop });

  return (
    <div {...getRootProps({ style })}>
      <input {...getInputProps()} value={props.productState} />
      <p>Drag files here, or click to browse</p>
    </div>
  );
}

 类似资料:
  • 我尝试在云函数中使用Firestore,但遇到了错误 数据库。集合(…)。文档(…)。集合(…)。文档(…)。add不是promise的功能 我先读了这些主题,然后又读了其他主题。但我没有帮我。包裹。json外观 云功能之一 此代码来自函数 我怎样才能修复它?

  • 正在尝试使用 手机短信插件 将短信功能添加到应用程序中。我已经完成了文档中提到的安装- 我添加行 但当我加上 在构造函数参数中,它在JS控制台中抛出以下错误,页面停止工作。 果心js:12501错误错误:未捕获(promise中):类型错误:对象(…)不是函数类型错误:对象(…)不是索引处的函数。js:93 at模块/node\u模块/@离子本机/短信/索引。js(index.js:142)at

  • 我想做的是将一个Map添加到一个ArrayList中,然后添加到一个JsonArray中。我打算做的是直接将映射添加到json数组中。

  • 我想在包含日期列的dataframe上使用函数,这样我就可以创建新列,该列将提供记录与哪个季度相关联的信息。 我试过的东西如下: 另外,当我尝试使用函数名的import语句时,它会给出如下错误:

  • 问题内容: 这个例子 在我看来,它与ajax加载函数的示例相同。正如代码片段可以告诉您的那样,它实际上会出错 我究竟做错了什么? 问题答案: https://code.jquery.com/jquery-3.2.1.slim.min.js是jquery的精简版,不包含ajax。slim是Express服务器中随附的默认版本。使用https://code.jquery.com/jquery-3.2.

  • 问题内容: 过去,已经进行了许多尝试以在Python中添加超时功能,以便在指定的时间限制到期时,等待的代码可以继续运行。不幸的是,以前的配方要么允许正在运行的功能继续运行并消耗资源,要么使用特定于平台的线程终止方法终止该功能。该Wiki的目的是针对这个问题开发跨平台的答案,许多程序员必须针对各种编程项目解决该问题。 编辑: 这段代码是为Python 3.x编写的,并非为装饰类方法而设计。该模块并非