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

Web3.js调用getBalance转fromWei后如何存储变量并展示在React表格

问题解决方案

核心问题梳理

  • 直接将checkBalance函数对象作为React子元素渲染,是报错的直接原因
  • 异步查询的余额没有存入响应式状态,无法同步到视图
  • web3.utils.fromWei()调用缺少入参,且await/then混用逻辑冗余
  • 没有指定余额查询的触发时机(组件挂载、账户变更时)

修正后代码

import { useState, useEffect } from 'react'
const Web3 = require("web3");

function App(){
  // 声明存储ETH余额的响应式状态
  const [ethBalance, setEthBalance] = useState("--");
  // 这里保留你已有的account变量定义
  // const account = ...

  const web3 = new Web3(
    Web3.givenProvider ||
      "https://ropsten.infura.io/v3/9aa3d95b3bc440fa88ea12eaa4456161"
  );

  async function fetchEthBalance() {
    if (!account) return;
    try {
      // 先获取wei单位的余额
      const balanceInWei = await web3.eth.getBalance(account);
      // 转换为ETH单位,必须传入余额参数
      const balanceInEth = web3.utils.fromWei(balanceInWei, "ether");
      // 存入状态触发视图更新
      setEthBalance(balanceInEth);
    } catch (error) {
      console.log("余额查询失败:", error);
      setEthBalance("查询失败");
    }
  }

  // 组件挂载、account变量变化时自动触发余额查询
  useEffect(() => {
    fetchEthBalance();
  }, [account, web3]);

  return (
    <Table variant="striped" width="100%">
      <TableCaption>Token balances of {account}</TableCaption>
      <Thead>
        <Tr>
          <Th>Token</Th>
          <Th>Contract Address</Th>
          <Th>Balance</Th>
        </Tr>
      </Thead>
      <Tbody>
        <Tr>
          <Td>ETH</Td>
          <Td>0x0000000000000000000000000000000000000000</Td>
          {/* 直接渲染状态变量即可 */}
          <Td>{ethBalance}</Td>
        </Tr>
      </Tbody>
      <Tfoot>
        <Tr>
          <Th>Token</Th>
          <Th>Contract Address</Th>
          <Th>Balance</Th>
        </Tr>
      </Tfoot>
    </Table>
  )
}

兼容低版本React说明

如果你使用的是16.8以下不支持Hook的React版本,可以将状态和查询逻辑放在类组件的state和componentDidUpdate生命周期中实现,逻辑完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 00:06:07