【发布时间】:2021-12-29 20:40:17
【问题描述】:
这是一个 Solidity 合约:
pragma solidity ^0.8.7;
contract SomeContract {
address public manager;
uint public theNumberNine;
mapping (string => mapping (address => uint)) public stringToAddrToInt;
constructor() {
manager = msg.sender;
theNumberNine = 9;
}
function setInt(string memory someString) public {
stringToAddrToInt[someString][msg.sender] = theNumberNine;
}
function getIntFromMapping(string memory someString) public view returns (uint) {
return stringToAddrToInt[someString][msg.sender];
}
}
这是一个 JSX 前端:
import React, { Component } from 'react';
import { Button } from 'semantic-ui-react';
import SomeContract from 'someContract';
import Web3 from 'web3';
class SomeClass extends Component {
static async getInitialProps(props) {
const { address, myString } = props.query;
const contractInstance = SomeContract(address);
const provider = new Web3.providers.HttpProvider(
'https://kovan.infura.io/my-endpoint-here'
);
const web3 = new Web3(provider);
const accounts = await web3.eth.getAccounts();
await contractInstance.methods.setInt(myString).send({
from: accounts[0]
});
const intFromSolidity = await contractInstance.methods.getIntFromMapping(myString).call();
return { intFromSolidity };
}
onSubmit = async () => {
console.log(this.props.intFromSolidity);
}
render() {
return (
<Button basic onClick={this.onSubmit}>
I should output 9
</Button>
);
}
}
预期输出:9
实际输出:未定义
控制台日志未定义,但是在 Remix 中调用 getIntFromMapping 时,它会按预期输出 9。对于这种行为的原因,以及如何正确返回 Solidity 映射值以便在 React 组件中使用,我将不胜感激。
【问题讨论】:
-
在您的组件中,您有
getIntfromMapping(小写 F)。 JavaScript 区分大小写。这是一个错字还是您的代码实际上是错误的? -
抱歉,打错字了。
标签: javascript reactjs next.js ethereum solidity