You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React项目运行npm start时出现多个未定义(no-undef)错误求助

解决React项目中getFiles、onDrop及相关变量未定义的错误

我仔细看了你的代码和报错信息,这些错误主要是因为混用了类组件与函数组件的写法,加上部分变量/对象未正确声明或初始化导致的。下面分点拆解问题并给出修复方案:

核心问题拆解

  • 函数定义位置错误:getFiles和onDrop定义在App函数外部,还使用了类组件的this.state、this.setState语法,但你的App是函数组件,完全不适用这种写法。
  • 未声明的变量:Web3、account、instance这些变量没有在代码中引入或初始化,直接调用必然触发未定义错误。
  • 错误使用this:函数组件没有实例对象,不能通过this访问状态或方法。

逐步修复方案

1. 迁移函数到组件内部,改用React Hooks

把getFiles和onDrop移到App函数内部,用useState管理状态,用useContext从EthProvider中获取Web3相关数据。

2. 正确引入并初始化Web3相关变量

从EthContext中获取web3、account、contract(对应你代码里的instance),同时显式引入Web3库。

3. 替换类组件状态逻辑

用useState替代类组件的this.state,用useEffect替代组件挂载/更新时的逻辑触发。

修改后的完整App.jsx代码

import { useContext, useState, useEffect } from "react";
import { EthProvider, EthContext } from "./contexts/EthContext"; // 确保EthContext正确导出
import SolidityDriveContract from "./contracts/SolidityDrive.json";
import Intro from "./components/Intro/";
import Setup from "./components/Setup";
import Demo from "./components/Demo";
import Footer from "./components/Footer";
import "react-drop-zone/dist/styles.css";
import "./App.css";
import { StyledDropZone } from 'react-drop-zone';
import { Table } from "reactstrap";
import { FileIcon, defaultStyles } from 'react-file-icon';
import fileReaderPullStream from 'pull-file-reader';
import ipfs from "./ipfs";
import Web3 from "web3"; // 显式引入Web3库

function App() {
  const { web3, account, contract } = useContext(EthContext); // 从Context获取Web3相关数据
  const [solidityDrive, setSolidityDrive] = useState([]); // 用useState管理文件列表状态

  // 获取合约中的文件列表
  const getFiles = async () => {
    try {
      if (!account || !contract) return; // 先校验依赖是否存在
      const filesLength = await contract.methods.getLength().call({ from: account[0] });
      const files = [];
      for (let i = 0; i < filesLength; i++) {
        const file = await contract.methods.getFile(i).call(account[0]);
        files.push(file);
      }
      setSolidityDrive(files); // 更新状态
    } catch (error) {
      console.error("获取文件列表失败:", error);
    }
  };

  // 处理文件拖放上传逻辑
  const onDrop = async (file) => {
    try {
      if (!account || !contract) return;
      const stream = fileReaderPullStream(file);
      const uploadResult = await ipfs.add(stream);
      // 这里可以补充将IPFS哈希写入合约的逻辑
      console.log("文件上传IPFS成功:", uploadResult);
    } catch (error) {
      console.error("文件上传失败:", error);
    }
  };

  // 当account或contract变化时,自动拉取最新文件列表
  useEffect(() => {
    if (account && contract) {
      getFiles();
    }
  }, [account, contract]);

  return (
    <EthProvider>
      <div id="App">
        <div className="container">
          <Intro />
          <Setup />
          <Demo />
          <StyledDropZone onDrop={onDrop} />
          <Table>
            <thead>
              <tr>
                <th width="7%" scope="row">Type</th>
                <th>Filename</th>
                <th>Date</th>
              </tr>
            </thead>
            <tbody>
              {/* 渲染从合约获取的文件列表 */}
              {solidityDrive.map((file, index) => (
                <tr key={index}>
                  <th>
                    <FileIcon 
                      size={30} 
                      extension={file.extension} 
                      {...defaultStyles[file.extension] || defaultStyles.default} 
                    />
                  </th>
                  <th>{file.filename}</th>
                  <th>{file.date}</th>
                </tr>
              ))}
            </tbody>
          </Table>
          <hr />
          <Footer />
        </div>
      </div>
    </EthProvider>
  );
}

export default App;

额外注意事项

  • 请确保EthContext中正确导出了web3、account、contract这三个值,否则useContext无法获取到数据。
  • 检查ipfs.js是否正确初始化了IPFS实例,避免文件上传时出现额外错误。
  • 原代码中this.setState({ Web3, account, contract: instance }, this.getFiles);属于完全错误的写法,已经替换为useEffect在依赖变化时自动触发getFiles。

内容的提问来源于stack exchange,提问作者David Cobbs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 15:17:42