【发布时间】:2022-11-11 07:24:00
【问题描述】:
上下文:该应用程序是一个简单的链上待办事项列表,可让您查看待办事项列表并创建新的待办事项。
问题:当我创建新的待办事项并使用createTask() 将其发送到链上时,我正在努力检查交易确认,然后我可以重新渲染待办事项列表以显示新提交的输入并在链上确认。
技术栈:Web3.js + React
供您参考:我一直在关注本教程:https://www.dappuniversity.com/articles/ethereum-dapp-react-tutorial。
import './App.css';
import Web3 from 'web3'
import { useEffect, useState } from 'react'
import { TODOLIST_ABI, TODOLIST_ADDRESS } from './config'
import Tasks from './Tasks'
import CreateTasks from './CreateTasks'
const App = () => {
const [acct, setAcct] = useState('')
const [contract, setContract] = useState([])
const [task, setTask] = useState([])
const [taskCount, setTaskCount] = useState(0)
const [loading, setLoading] = useState(false)
const loadBlockchainData = async () => {
setLoading(true)
const provider = window.ethereum
try {
const web3 = await new Web3(provider)
const acc = await (await web3.eth.requestAccounts())[0]
setAcct(acc)
const todo_list = new web3.eth.Contract(TODOLIST_ABI, TODOLIST_ADDRESS)
setContract(todo_list)
const taskCount = await todo_list.methods.taskCount().call()
setTaskCount(taskCount)
for (var i = 1; i <= taskCount; i++) {
// methods.mymethod.call - call constant method sithout sending any transaction
const temp_task = await todo_list.methods.tasks(i).call()
setTask(t => {return [...t, temp_task]})
}
setLoading(false)
} catch (error) {
console.log(`Load Blockchain Data Error: ${error}`)
}
}
const loadTasks = async () => {
const taskCount = await contract.methods.taskCount().call()
setTaskCount(taskCount)
setTask(() => [])
for (var i = 1; i <= taskCount; i++) {
// methods.mymethod.call - call constant method sithout sending any transaction
const temp_task = await contract.methods.tasks(i).call()
setTask(t => {return [...t, temp_task]})
}
}
const createTask = async (text) => {
setLoading(true)
console.log(`onsubmit: ${text}`)
await contract.methods.createTask(text).send({from: acct}).once('sent', r => {
console.log(`Transaction Hash: ${r['transactionHash']}`)
loadTasks()
})
setLoading(false)
}
useEffect(() => {
loadBlockchainData()
}, [])
return (
<>
<h1>Hello</h1>
<p>Your account: { acct }</p>
{loading? (<p>loading...</p>) : (<Tasks task={ task }/>)}
<CreateTasks contract={ contract } account={ acct } createTask={ createTask }/>
</>
)
}
export default App;
【问题讨论】:
标签: javascript reactjs ethereum web3js web3-react