1

以下是我的代码片段(正在运行)

....

let txhash = '';

class App extends Component {
  ....

  async componentDidMount() {
    .....
  }

  onSubmit = async(event) => {
    event.preventDefault();
    const accounts = await web3.eth.getAccounts();

    this.setState({
      message: "Waiting for the transaction to be mined..."
    });

    await lottery.methods.enterLotteryContract().send({
      from: accounts[0],
      value: web3.utils.toWei(this.state.value, 'ether')
    }).on('transactionHash', function(hash) {
      txhash = hash
    });

    this.setState({
      message: "Congrats, the tx has been mined; your txhash  is " + txhash
    })
    console.log(txhash);
  });
}

更多在这里:https ://github.com/DKSukhani/lottery-react/blob/master/src/App.js

想知道是否有更好的方法让我获取txhash然后显示它。我希望我可以将txhash其作为状态组件之一,而不是将其声明为空变量。此外,我使用回调函数仅将其重新分配给txhash.

4

1 回答 1

0

你能把你的问题问得更清楚一点吗?您的代码很有意义,并且对于某些未知目的看起来很好。不过,这个目的正是我需要知道的。

  • 您什么时候需要 txHash,是在每次调用此函数之后还是您尝试跟踪其他内容。
  • 为什么它不能是一个状态变量,你没有在你的片段中包含状态,所以我不得不去看看你的代码的其余部分,没有理由不这样做。您在代码段中使用它,因此很明显您可以在某种程度上使用它。我不使用 React,所以可能存在一些渲染循环、侦听器问题或其他无法使用 setState 的原因。

话虽如此,请查看此链接以了解您可以收听的不同事件on,因为我认为您正在收听错误的事件或输出错误的文本。当您将状态消息设置为说 tx 已被开采时,我不相信它实际上已经被开采了。

我会使用confirmation并且仅在事件第一次触发时显示消息,然后忽略剩余的 23 个。此处描述了与确认号一起返回的对象,并且有一个transactionHash变量,您可以使用它来检查交易是否已确认并获取同时哈希。现在您的事件调用不再那么浪费,您可以对消息使用与 txHash 相同的 setState 调用,或者甚至完全跳过存储 txHash(只要您仍然可以异步使用 setState)。

于 2018-10-22T03:08:02.077 回答