web3 React dapp项目通过事件从区块链中拿到 已取消 已完成 和所有的订单数据 并存入redux中

好 上文web3通过antd 在React dapp中构建订单组件基本结构我们算是把一个基本的订单组件展示做出来了

然后 我们继续 起一下环境先
ganache 终端运行

ganache -d

在这里插入图片描述 MetaMask 登录一下
在这里插入图片描述
然后 打开项目 发布一下合约

truffle migrate --reset

在这里插入图片描述
然后 运行一下 测试脚本 转入交易所 ETH和grToken 还创建两个订单

truffle exec .\scripts\test.js

在这里插入图片描述
然后 运行起 dapp项目
在这里插入图片描述
好 那我们就开始啦

我们还是要用 redux 来管理全局的订单数据
这样就不需要考虑界面更新的问题了 redux 都会帮我们处理

这里 我们先找到 根目录下 src下的 redux下的 balanceSlice 目录
下面创建一个 orderSlice.js
参考代码如下

import { createSlice, createAsyncThunk } from "@reduxjs/toolkit";;const orderSlice = createSlice({name:"order",initialState: {Cancelorders: [],  //已经取消的订单Fillorders: [],   //已经完成的订单Allorders: []  //全部的订单},reducers: {setCancelorders(state,action) {state.Cancelorders = action.payload},setFillorders(state,action) {state.Fillorders = action.payload},setAllorders(state,action) {state.Allorders = action.payload}}
})export const { setCancelorders, setFillorders, setAllorders } = orderSlice.actions;export default orderSlice.reducer;export const loadCancelorderData = createAsyncThunk("order/fetchCancelorderData",async (data, {dispatch}) => {}
)

这里 我们还是简单书写了一个 redux 数据结构 里面数据分为三个集合 分别是 所有取消的订单 所有已经完成的订单 所有的订单
然后 分别给他们三个写上了 对应的set函数

但是呢 我们异步这里 不能写成一个了 很多人可能觉得 我们写一个异步函数 先获取 Cancelorders 然后获取 Fillorders 最后获取 Allorders
这个作为现在的开发视角没问题 但后面我们需要考虑订阅和取消订阅的情况
所以 获取数据不能放在一起
这里 我们先写一个Cancelorders的试试水
当然 还是要先引入 我们找到 根目录下 src下的 redux 下的index.js
导入一下这个刚写的 orderSlice
在这里插入图片描述
然后 我们在 src下的 view 中 index.jsx 组件中 去使用这个函数
在这里插入图片描述
这里 我们导入了 自己写的 loadCancelorderData 并调用他 虽然 loadCancelorderData和loadBalanceData 都是异步的 但是 我们并不需要考虑先后执行的问题 因为他们之间并不关联 谁先谁后执行 影响不大

然后 我们来到 loadCancelorderData 函数 这里最关键的是拿到交易所的合约
因为订单都在交易所中
在这里插入图片描述
我们先打印在控制台中看一下
在这里插入图片描述
可以看到 这个交易所的合约是拿得到的

然后 我们打开交易所的合约 看到订单的整体结构 之前我们就是这样去做一个存储的
在这里插入图片描述
但是 这里 我们用的是mapping 一个对象的形式 我们想拿到对应数据 需要传入id
那么 解决办法 最基本的就是 改成一个数组结构 但显然 我不会选择写到一半再去改合约
那么 大家应该还记得 之前我说过 区块链就是能对事件信息进行存储 而且 不可篡改

还记得我们之前写的事件吗? 我们在 发布订单 取消订单 执行订单 都会记录事件 而我们直接可以去拿取这些事件的记录
在这里插入图片描述
这里 我们直接 将 loadCancelorderData事件 代码更改如下

export const loadCancelorderData = createAsyncThunk("order/fetchCancelorderData",async (data, {dispatch}) => {const {Exchange} = data;const result = await Exchange.getPastEvents("Cancel", {fromBlock:0,toBlock: "latest"})console.log(result)}
)

这里 我们调用了交易所自带的一个事件 叫 getPastEvents 这个函数可以拿到合约之前记在链上的事件
然后 我们要拿到事件是 Cancel 这是之前我们在合约上写的 用来记录取消订单的事件
在这里插入图片描述然后里面的两个参数 fromBlock 表示 我们要第0个区块 简单说 最新的 然后 latest 表示我们要最新的
然后 输出打印结果
运行代码后 我们看控制台
在这里插入图片描述
很明显 我们成功了 拿到了一个数组 因为我们就一个取消的订单 所以 只有一条数据

然后 外面很多都是区块的信息 其实我们真正的订单自己写的信息在 returnValues中
在这里插入图片描述
每一条订单数据中都有一个 returnValues 这才是我们自己写的字段
我们可以把他过滤出来

我们可以这样写
在这里插入图片描述
还是整理成一个数组 但是 我们只要他里面的 returnValues字段
运行结果如下
在这里插入图片描述
那么 既然数据拿到了 我们调用 dispatch 调用指定set函数 将他写回到对应的数据中
在这里插入图片描述
然后 所有的 也是一样的 这里 我们再写一个事件 参考代码如下

export const loadAllrderData = createAsyncThunk("order/fetchAlorderData",async (data, {dispatch}) => {const {Exchange} = data;const result = await Exchange.getPastEvents("Order", {fromBlock:0,toBlock: "latest"})const Allorders = result.map(item=>item.returnValues)dispatch(setAllorders(Allorders))}
)

和我们 刚才写的 获取取消的订单的数据的格式基本是一样的
只是 这里 我们改了个名字 然后调用的事件是 Order
这是我们之前合约用来记录 已创建订单的
在这里插入图片描述
然后 拿到数据 做一个数据的回写

然后 就是 完成订单的查询 也是一模一样

export const loadFillorderData = createAsyncThunk("order/fetchFillorderData",async (data, {dispatch}) => {const {Exchange} = data;const result = await Exchange.getPastEvents("Fill", {fromBlock:0,toBlock: "latest"})const Fillorders = result.map(item=>item.returnValues)dispatch(setFillorders(Fillorders))}
)

这里 改个名字 然后 这里 我们要调用的是 Fill 之前我们合约定义来记录填充订单的事件
在这里插入图片描述
最后 拿到数据写入一下

写完之后 我们来到 src目录下的 view 目录下的index.jsx 将其他两个事件一起导入 然后调用一下
在这里插入图片描述
然后 我们运行代码 数据明显是进去了的
在这里插入图片描述
但是 我们控制台会报一个警告
在这里插入图片描述
好家伙 还是非常可怕的 满山红

其实这个问题 是因为 我们订单是一个非序列化数据 存在redux 中会出现的一个问题

他这里 我们明显看到数据是进去了的 而且存储看着也和我们预期的格式是一样的
她这个警告是说 你这个是个非序列化的数据 不符合我们的规范 将来如果出问题 你可别怪我们的框架

这个问题 如果你不想他出来 就可以直接关闭redux中对数据的一个检查

我们找到 src目录下 redux 目录下 index.js 中 在configureStore 加入一个这样的配置

middleware:getDefaultMiddleware => getDefaultMiddleware({serializableCheck:false
})

关闭掉他对数据的检查
在这里插入图片描述
然后 我们再次运行 控制台就干净了
在这里插入图片描述
好 那这样 我们的订单数据就拿到啦

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/138967.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

excel中超级表和普通表的相互转换

1、普通表转换为超级表 选中表内任一单元格,然后按CtrlT,确认即可。 2、超级表转换为普通表 选中超级表内任一单元格,右键,表格,转换为区域,确定即可。 这时虽然已经变成了普通表,但样式没有…

数据库 关系数据理论

问题 数据冗余更新异常插入异常删除异常 一个好的模式应当不会发生插入异常、删除异常和更新异常,数据冗余应尽可能少 数据依赖 定义:一个关系内部属性与属性之间的一种约束关系(该约束关系是通过属性间值的相等与否体现出来数据间相关联…

iOS 17.2更新:15Pro支持拍摄空间视频!

苹果又为开发者预览版用户推送了iOS 17.2 Beta2测试版的更新,已经注册Apple Beta版软件计划的用户只需打开设置--通用--软件更新即可在线OTA升级至最新的iOS 17.2测试版。 本次更新包大小为750M左右,内部版本号为(21C5040g)&#…

『 MySQL数据库 』数据库基础之表的基本操作

文章目录 创建表🗡查看表🗡✒ 查看表内所有信息(描述\表结构等)✒ 根据条件查看表内数据✒ 查看表的具体详细信息: 修改表🗡✒ 修改表名:✒ 修改表的存储引擎、编码集(字符集和校验集):✒ 表内插入数据:insert into✒ 在表中新添一个字段(列)…

HarmonyOS应用开发-ArkTS基础知识

作者:杨亮Jerry 作为多年的大前端程序开发工作者,就目前的形式,个人浅见,在未来3-5年,移动端依旧是Android系统和iOS系统的天下。不过基于鸿蒙系统的应用开发还是值得我们去花点时间去了解下的,阅读并实践官…

win环境Jenkins高级配置各种插件和启动jar包

今天分享Jenkins高级配置各种插件,在看此篇之前必须先了解上一篇博客内容,因为此篇是在上篇的基础上完善的: 一、git仓库的多分支选择 想要多分支选择部署,需要全局安装Git parameter 插件 1、点击入口 来到 2、点击进入 安装一…

【m98】webrtc vs2017构建带符号的debug库

调试有符号 调试 无符号 试试exe不输出到独立的文件? -】 直接输出到sln下面

Semantic Kernel 学习笔记1

1. 挂代理跑通openai API 2. 无需魔法跑通Azure API 下载Semantic Kernel的github代码包到本地,主要用于方便学习python->notebooks文件夹中的内容。 1. Openai API:根据上述文件夹中的.env.example示例创建.env文件,需要填写下方两个内…

【神经网络】GAN:生成对抗网络

GAN:生成对抗网络 Generator(生成器)概念 和传统的神经网络不同,Generator除了接受x的输入之外,还会接受一个简单的分布作为z进行输入,从而使得网络的输出也是一个复杂的分布 为什么输出需要时一个分布呢…

VScode + opencv(cmake编译) + c++ + win配置教程

1、下载opencv 2、下载CMake 3、下载MinGW 放到一个文件夹中 并解压另外两个文件 4、cmake编译opencv 新建文件夹mingw-build 双击cmake-gui 程序会开始自动生成Makefiles等文件配置,需要耐心等待一段时间。 简单总结下:finish->configuring …

Linux的make和Makefile

目录 一、 介绍二、快速使用三、依赖关系和依赖方法四、语法 一、 介绍 1、makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。 2、make是一个命令工具&…

Python异常处理:三种不同方法的探索与最佳实践

Python异常处理:三种不同方法的探索与最佳实践 前言 本文旨在探讨Python中三种不同的异常处理方法。通过深入理解各种异常处理策略,我们可以更好地应对不同的编程场景,选择最适合自己需求的方法。 异常处理在编程中扮演着至关重要的角色。合…

Win10共享打印机,别人连接不上出现无法连接到打印机错误码0x0000011b

环境: Win10 专业版 惠普L1119 问题描述: Win10共享打印机,别人连接不上出现无法连接到打印机错误码0x0000011b 解决方案: 1.打开我这台电脑的注册表找到 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Print在右侧…

JVM之类加载器

文章目录 版权声明类加载器类加载器的分类启动类加载器拓展类加载器&应用程序类加载器 双亲委派机制解决三个问题 打破双亲委派机制自定义类加载器案例演示线程上下文类加载器案例梳理OSGi模块化 版权声明 本博客的内容基于我个人学习黑马程序员课程的学习笔记整理而成。我…

KVM虚拟机迁移原理与实践

虚拟机迁移 迁移(migration)包括系统整体的迁移和某个工作负载的迁移,系统整体迁移是将系统上的所有软件,包括操作系统,完全复制到另一台物理硬件机器上,而工作负载迁移仅仅迁移特定的工作负载。 虚拟化技术的出现,丰…

Linux学习第二枪(yum,vim,g++/gcc,makefile的使用)

前言:在我的上一篇Linux博客我已经讲了基础指令和权限,现在我们来学习如何在Linux上运行和执行代码 目录 一,yum 二,vim 1)命令行模式 2)插入模式 3)底行模式 三,gcc/g 四&a…

MATLAB的编程与应用,匿名函数、嵌套函数、蒙特卡洛法的掌握与使用

目录 1.匿名函数 1.1.匿名函数的定义与分类 1.2.匿名函数在积分和优化中应用 2.嵌套函数 2.1.嵌套函数的定义与分类 2.2.嵌套函数彼此调用关系 2.3.嵌套函数在积分和微分中应用 3.微分和积分 4.蒙特卡洛法 4.1.圆周率的模拟 4.2.计算N重积分(均匀分布&am…

计算机提示找不到xinput1_3.dll怎么办?6个xinput1_3.dll丢失完美解决方案分享

xinput1_3.dll是Windows操作系统中的一个重要动态链接库文件,它负责处理游戏控制器和其他输入设备的相关功能。当计算机出现xinput1_3.dll缺失的问题时,可能会导致无法正常使用游戏控制器或其他输入设备。下面是针对这个问题的6个解决方法: 方…

微服务-我对Spring Clound的理解

官网:https://spring.io/projects/spring-cloud 官方说法:Spring Cloud 为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理、服务发现、熔断器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式会话…

分布式搜索引擎ES

文章目录 初识elasticsearch了解ES倒排索引正向索引倒排索引正向和倒排 es的一些概念文档和字段索引和映射mysql与elasticsearch 安装ES部署kibana安装IK分词器扩展词词典停用词词典 索引库操作mapping映射属性索引库的CRUD创建索引库和映射查询索引库修改索引库删除索引库 文档…