web3 React dapp进行事件订阅

好啊,上文web3 React Dapp书写订单 买入/取消操作我们已经写好了 填充和取消订单

这就已经是非常大的突破了 但是 留下了一个问题 那就是 我们执行完之后 订单的数据没有直接更新 每次都需要我们手动刷新 才能看到结果

那么 今天我们就来看解决这个问题的事件订阅

我们下启动一下环境

ganache 环境 终端运行

javascript 复制代码
ganache -d

登录一下 MetaMask

运行我们的 dapp 发布一下合约

javascript 复制代码
truffle migrate --reset

然后 运行 转让 交易所 token与ETH的测试脚本 制造数据

javascript 复制代码
truffle exec .\scripts\test.js

然后 运行专门用来创建订单的脚本

javascript 复制代码
truffle exec .\scripts\createOrder.js

最后 我们启动前端 dapp系统

我们 全局数据初始化 是在 src下的 view 中的index 组件 那么 我们监听也就在这里去执行 毕竟他才是全局状态的一个管理入口

这里 我们看到 交易所的智能合约 我们写了三个事件 Order创建订单 Cancel取消订单 Fill填充订单

他们分别来记录我们的三种事件

那么 我们就可以在web端 监听这三个事件

这里 我们直接将 src目录下的 view 下的index.jsx 中的 useEffect 声明周期代码更改如下

typescript 复制代码
useEffect(() =>{
  async function start(){
        const WebData = await initialization()
        window.WebData = WebData;
        dispatch(loadBalanceData(WebData))
        dispatch(loadCancelorderData(WebData))
        dispatch(loadAllrderData(WebData))
        dispatch(loadFillorderData(WebData))
        
        //监听创建订单完成
        WebData.Exchange.events.Order({},(error,event)=> {
          console.log("创建了订单")
          console.log("错误信息",error)
          console.log("事件参数",event)
          dispatch(loadBalanceData(WebData))
          dispatch(loadCancelorderData(WebData))
          dispatch(loadAllrderData(WebData))
          dispatch(loadFillorderData(WebData))
        })
        //监听取消订单完成
        WebData.Exchange.events.Cancel({},(error,event)=> {
          console.log("取消了订单")
          console.log("错误信息",error)
          console.log("事件参数",event)
          dispatch(loadBalanceData(WebData))
          dispatch(loadCancelorderData(WebData))
          dispatch(loadAllrderData(WebData))
          dispatch(loadFillorderData(WebData))
        })
        //监听填充订单完成
        WebData.Exchange.events.Fill({},(error,event)=> {
          console.log("填充了订单")
          console.log("错误信息",error)
          console.log("事件参数",event)
          dispatch(loadBalanceData(WebData))
          dispatch(loadCancelorderData(WebData))
          dispatch(loadAllrderData(WebData))
          dispatch(loadFillorderData(WebData))
        })
    }
    start();
},[dispatch])

这里 我们通过全局对象 WebData 拿到我们交易所的智能合约对象 Exchange 并分别监听了 我们刚才说的三个事件

事件触发会带来两个参数 error 错误信息 event 调用事件时 传递的参数

然后 我们这里 简单输出了事件做了什么 和 调用了所有异步加载数据的函数 重新更新一下数据

然后 我们运行项目 尝试 取消一个订单

这里 我们就可以看到 我们订单 从 5条 变成了 4条 无需我们自己刷新 数据就更新了 控制台也输出了 我们的事件类型 和 信息

然后 我们尝试买入一个订单

也是一样 我们整体更新的事件触发了

页面也将相关信息输出了出来

然后 我们重写执行脚本

javascript 复制代码
truffle exec .\scripts\createOrder.js

你会惊奇的发现 我们dapp的监听事件触发了 就是 不一定是当前界面触发的 其他地方创建了订单 或者取消 填充订单 我们订阅了他 事件就会触发 有点实时通讯的味道了哈

相关推荐
2501_9209317040 分钟前
React Native鸿蒙跨平台采用ScrollView的horizontal属性实现横向滚动实现特色游戏轮播和分类导航
javascript·react native·react.js·游戏·ecmascript·harmonyos
0思必得02 小时前
[Web自动化] Selenium处理动态网页
前端·爬虫·python·selenium·自动化
摘星编程2 小时前
React Native鸿蒙版:Drawer抽屉导航实现
react native·react.js·harmonyos
东东5163 小时前
智能社区管理系统的设计与实现ssm+vue
前端·javascript·vue.js·毕业设计·毕设
catino3 小时前
图片、文件的预览
前端·javascript
2501_920931704 小时前
React Native鸿蒙跨平台实现推箱子游戏,完成玩家移动与箱子推动,当所有箱子都被推到目标位置时,玩家获胜
javascript·react native·react.js·游戏·ecmascript·harmonyos
layman05285 小时前
webpack5 css-loader:从基础到原理
前端·css·webpack
半桔5 小时前
【前端小站】CSS 样式美学:从基础语法到界面精筑的实战宝典
前端·css·html
AI老李5 小时前
PostCSS完全指南:功能/配置/插件/SourceMap/AST/插件开发/自定义语法
前端·javascript·postcss
_OP_CHEN5 小时前
【前端开发之CSS】(一)初识 CSS:网页化妆术的终极指南,新手也能轻松拿捏页面美化!
前端·css·html·网页开发·样式表·界面美化