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

这篇具有很好参考价值的文章主要介绍了web3 React dapp项目通过事件从区块链中拿到 已取消 已完成 和所有的订单数据 并存入redux中。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

ganache -d

web3 React dapp项目通过事件从区块链中拿到 已取消 已完成 和所有的订单数据 并存入redux中,web3,react.js,区块链 MetaMask 登录一下
web3 React dapp项目通过事件从区块链中拿到 已取消 已完成 和所有的订单数据 并存入redux中,web3,react.js,区块链
然后 打开项目 发布一下合约

truffle migrate --reset

web3 React dapp项目通过事件从区块链中拿到 已取消 已完成 和所有的订单数据 并存入redux中,web3,react.js,区块链
然后 运行一下 测试脚本 转入交易所 ETH和grToken 还创建两个订单

truffle exec .\scripts\test.js

web3 React dapp项目通过事件从区块链中拿到 已取消 已完成 和所有的订单数据 并存入redux中,web3,react.js,区块链
然后 运行起 dapp项目
web3 React dapp项目通过事件从区块链中拿到 已取消 已完成 和所有的订单数据 并存入redux中,web3,react.js,区块链
好 那我们就开始啦

我们还是要用 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
web3 React dapp项目通过事件从区块链中拿到 已取消 已完成 和所有的订单数据 并存入redux中,web3,react.js,区块链
然后 我们在 src下的 view 中 index.jsx 组件中 去使用这个函数
web3 React dapp项目通过事件从区块链中拿到 已取消 已完成 和所有的订单数据 并存入redux中,web3,react.js,区块链
这里 我们导入了 自己写的 loadCancelorderData 并调用他 虽然 loadCancelorderData和loadBalanceData 都是异步的 但是 我们并不需要考虑先后执行的问题 因为他们之间并不关联 谁先谁后执行 影响不大

然后 我们来到 loadCancelorderData 函数 这里最关键的是拿到交易所的合约
因为订单都在交易所中
web3 React dapp项目通过事件从区块链中拿到 已取消 已完成 和所有的订单数据 并存入redux中,web3,react.js,区块链
我们先打印在控制台中看一下
web3 React dapp项目通过事件从区块链中拿到 已取消 已完成 和所有的订单数据 并存入redux中,web3,react.js,区块链
可以看到 这个交易所的合约是拿得到的

然后 我们打开交易所的合约 看到订单的整体结构 之前我们就是这样去做一个存储的
web3 React dapp项目通过事件从区块链中拿到 已取消 已完成 和所有的订单数据 并存入redux中,web3,react.js,区块链
但是 这里 我们用的是mapping 一个对象的形式 我们想拿到对应数据 需要传入id
那么 解决办法 最基本的就是 改成一个数组结构 但显然 我不会选择写到一半再去改合约
那么 大家应该还记得 之前我说过 区块链就是能对事件信息进行存储 而且 不可篡改

还记得我们之前写的事件吗? 我们在 发布订单 取消订单 执行订单 都会记录事件 而我们直接可以去拿取这些事件的记录
web3 React dapp项目通过事件从区块链中拿到 已取消 已完成 和所有的订单数据 并存入redux中,web3,react.js,区块链
这里 我们直接 将 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 这是之前我们在合约上写的 用来记录取消订单的事件
web3 React dapp项目通过事件从区块链中拿到 已取消 已完成 和所有的订单数据 并存入redux中,web3,react.js,区块链然后里面的两个参数 fromBlock 表示 我们要第0个区块 简单说 最新的 然后 latest 表示我们要最新的
然后 输出打印结果
运行代码后 我们看控制台
web3 React dapp项目通过事件从区块链中拿到 已取消 已完成 和所有的订单数据 并存入redux中,web3,react.js,区块链
很明显 我们成功了 拿到了一个数组 因为我们就一个取消的订单 所以 只有一条数据

然后 外面很多都是区块的信息 其实我们真正的订单自己写的信息在 returnValues中
web3 React dapp项目通过事件从区块链中拿到 已取消 已完成 和所有的订单数据 并存入redux中,web3,react.js,区块链
每一条订单数据中都有一个 returnValues 这才是我们自己写的字段
我们可以把他过滤出来

我们可以这样写
web3 React dapp项目通过事件从区块链中拿到 已取消 已完成 和所有的订单数据 并存入redux中,web3,react.js,区块链
还是整理成一个数组 但是 我们只要他里面的 returnValues字段
运行结果如下
web3 React dapp项目通过事件从区块链中拿到 已取消 已完成 和所有的订单数据 并存入redux中,web3,react.js,区块链
那么 既然数据拿到了 我们调用 dispatch 调用指定set函数 将他写回到对应的数据中
web3 React dapp项目通过事件从区块链中拿到 已取消 已完成 和所有的订单数据 并存入redux中,web3,react.js,区块链
然后 所有的 也是一样的 这里 我们再写一个事件 参考代码如下

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
这是我们之前合约用来记录 已创建订单的
web3 React dapp项目通过事件从区块链中拿到 已取消 已完成 和所有的订单数据 并存入redux中,web3,react.js,区块链
然后 拿到数据 做一个数据的回写

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

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 之前我们合约定义来记录填充订单的事件
web3 React dapp项目通过事件从区块链中拿到 已取消 已完成 和所有的订单数据 并存入redux中,web3,react.js,区块链
最后 拿到数据写入一下

写完之后 我们来到 src目录下的 view 目录下的index.jsx 将其他两个事件一起导入 然后调用一下
web3 React dapp项目通过事件从区块链中拿到 已取消 已完成 和所有的订单数据 并存入redux中,web3,react.js,区块链
然后 我们运行代码 数据明显是进去了的
web3 React dapp项目通过事件从区块链中拿到 已取消 已完成 和所有的订单数据 并存入redux中,web3,react.js,区块链
但是 我们控制台会报一个警告
web3 React dapp项目通过事件从区块链中拿到 已取消 已完成 和所有的订单数据 并存入redux中,web3,react.js,区块链
好家伙 还是非常可怕的 满山红

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

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

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

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

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

关闭掉他对数据的检查
web3 React dapp项目通过事件从区块链中拿到 已取消 已完成 和所有的订单数据 并存入redux中,web3,react.js,区块链
然后 我们再次运行 控制台就干净了
web3 React dapp项目通过事件从区块链中拿到 已取消 已完成 和所有的订单数据 并存入redux中,web3,react.js,区块链
好 那这样 我们的订单数据就拿到啦文章来源地址https://www.toymoban.com/news/detail-752459.html

到了这里,关于web3 React dapp项目通过事件从区块链中拿到 已取消 已完成 和所有的订单数据 并存入redux中的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • web3 在React dapp中全局管理web3当前登录用户/智能合约等信息

    上文 Web3 React项目Dapp获取智能合约对象我们在自己的前端dapp项目中链接获取到了 自己的智能合约 我们继续 我们还是先启动ganache环境 终端输入 然后发布一下我们的智能合约 打开我们的合约项目 终端输入 这样 我们的智能合约就部署到区块链上了 然后 我们启动项目 打开浏

    2024年02月06日
    浏览(48)
  • 【区块链】走进web3的世界-DApp如何快速接入wall

    在web3中,wall是您进入区块链的一个标识,每个用户使用的wall都不近相同,因此接入更多的wall是很有必要的,从用户角度来说,非必要情况下,我是不愿意去额外下载wall的。因此今天我们来聊一下,DApp如何快速的接入wall。 1、基于wagmi 1.1 在wagmi中内置了很多 wall 的连接,可

    2024年02月04日
    浏览(43)
  • 关于区块链、Web3.0、智能合约、DApp、DAO一文解释清楚

    区块链简单理解就是, 所有数据变成区块组成的链条,一个区块里保存着一条数据。 一笔支付、一个评论、一次查看、一条短信、一袋苹果都能保存为一个数据区块。 由于区块通过链条环环相扣,这确保了链上的数据是不可被篡改的。 链条复制了多条副本放置到多台互不相

    2024年02月02日
    浏览(69)
  • 【区块链 | Solidity】Solidity开发教程:用Web3.js构建第一个Dapp

    Web3.js 使用的实用介绍 原文 作者:wissal haji 欢迎订阅《Solidity智能合约零基础开发教程专栏》系列文章。 如果你一直在跟着这个系列学习,那么你已经掌握了编写自己的智能合约。 因此,今天给大家介绍一下构建去中心化应用的全貌,并向大家介绍一下web3.js,这是构建da

    2024年01月24日
    浏览(53)
  • web3 React dapp中编写balance组件从redux取出并展示用户资产

    好啊 上文WEB3 在 React搭建的Dapp中通过redux全局获取并存储用户ETH与自定义token与交易所存储数量中 我们拿到了用户的一个本身 和 交易所token数量 并放进了redux中做了一个全局管理 然后 我们继续 先 起来ganache的一个模拟环境 然后 我们启动自己的项目 顺手发布一下合约 然后

    2024年02月05日
    浏览(39)
  • 以太坊Dapp通过web3js部署调用智能合约

    参考视频:https://www.bilibili.com/video/BV14z4y1Z7Jd?p=1 https://remix.ethereum.org/ 创建一个新的文件夹 mkdir MyDapp2 启动 ganache-cli 下载web3 npm install web3 ,注:ganache的启动和deploy.js要在同一个目录。 先进行测试 node deploy.js 部署合约 web3的版本:1.7.1 复制 WEB3DEPLOY 的内容到deploy.js == ganache需要

    2023年04月23日
    浏览(46)
  • WEB3 在 React搭建的Dapp中通过redux全局获取并存储用户ETH与自定义token与交易所存储数量

    上文 web3 在React dapp中全局管理web3当前登录用户/智能合约等信息中 我们简单操作,将web3的公共信息都存在了window对象上 然后 我们先来启动一下环境 终端输入 打开项目 终端输入 在区块链上发布一下智能合约 然后 我们在 src下的 components 目录下创建两个组件 分别是 余额组件

    2024年02月05日
    浏览(51)
  • Web3通过ganache运行起一个本地虚拟区块链

    通过文章 Web3开发准备工作 手把手带你创建自己的 MetaMask 账号大家简单的对网络 有了个比较模糊的概念 不同的网络连接这不同的区块链 那么 我们就要搞清楚 我们切换不同的网络 我们的数字资产是不一样的 在这里 我们需要先安装一个插件工具 ganache 我们先在本地创建一个

    2024年02月11日
    浏览(41)
  • 【web3j】java通过web3j监听并解析合约中的事件(event/emit)

    ① 查询链上数据用的rpc(本示例是binance的,测试网可以使用:https://data-seed-prebsc-2-s2.binance.org:8545) ② 自己还要有一个测试链上部署好的合约,合约中要有一个方法emit了事件。 ③ java依赖 一、 通过自己合约的abi和bin生成一个java文件,abi和bin可以在remix的compiler模块中获取,

    2024年02月09日
    浏览(50)
  • 给Web3应用新增区块链数据(Web3项目一实战之六)

    当您在浏览首页以卡片形式来展示区块链列表数据(Web3项目一实战之五)时,不禁发问,既然首页读取了 区块链 列表数据,那么,那些列表数据总得在哪个页面进行添加进去吧!绝不会凭空冒出这许多数据的。 没错,如您所想,也正是您所猜测的那般, DApp 与传统 App 一样

    2024年02月05日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包