返回介绍

使用 Event

发布于 2024-06-02 01:00:06 字数 5534 浏览 0 评论 0 收藏 0

使用Event

如果想让UI界面丰富起来的话,不如使用ant-design这个基于React的框架,https://ant.design/docs/react/introduce-cn。

npm install antd --save

安装完npm包之后,我们直接修改App.js,并新建components目录,添加其他组件。

但是如果有一个场景:当新上传一个物品的时候,react这里需要知道,并且知道是哪个地址上传,这该如何实现?

以一个react 控件文件为例:

  componentDidMount() {
    const { market, web3 } = this.props;
    const updateInfo = (error, result) => {
      if (!error) {
        this.checkInfo();
      }
    }

    this.newCommodiftyEvent = market.NewCommodifty(updateInfo);

    this.checkInfo();
  }

  componentWillUnmount() {
    this.newCommodiftyEvent.stopWatching();
  }

这里就使用了Event,就是solidity里触发了一个事件然后回调到js这里,然后触发js方法:updateInfo的过程。

在Solidity源代码中,要定义一个event,可以通过在event关键字之前加上标记(与使用函数关键字类似)。 然后,可以在希望让事件发生的任何地方去调用或触发该event。

比如,我们如下修改合约代码:

  event NewCommodity(
    address employeeId
  );

  //  在addCommodity方法最后一行触发NewCommodity事件
    function addCommodity(string name, string url, uint price){
      require(bytes(name).length > 0);
      require(bytes(url).length > 0);

      warehouse[msg.sender] = Commodity(name, url, price.mul(1 ether), msg.sender, 0x0, now, false, 0);
      NewCommodity(msg.sender);
  }

按照这个逻辑,把market.sol 加上更新、删除、购买、支付的event,完整代码如下:

pragma solidity ^0.4.14;
import './SafeMath.sol';

contract Market{
    using SafeMath for uint;

    struct Commodity{
        string name;
        string url;
        uint price;
        address seller;
        address buyer;
        uint time;
        bool isFinish;
        uint timeInterval;
    }

    event NewCommodity(
      address employeeId
    );
    event UpdateCommodity(
      address employeeId
    );
    event RemoveCommodity(
      address employeeId
    );
    event NewBuyer(
      address buyer
    );
    event GetConfirm(
      address employeeId
    );

    mapping(address => Commodity) public warehouse ;

    modifier commodityExist(address seller){
        var commodity =  warehouse[seller];
        assert(commodity.seller != 0x0);
        _;
    }

    function buy(address seller) commodityExist(seller) payable returns (uint) {
        warehouse[seller].buyer = msg.sender;
        NewBuyer(msg.sender);
        return this.balance;
    }

    function addCommodity(string name, string url, uint price){
        require(bytes(name).length > 0);
        require(bytes(url).length > 0);

        warehouse[msg.sender] = Commodity(name, url, price.mul(1 ether), msg.sender, 0x0, now, false, 0);
        NewCommodity(msg.sender);
    }

    function removeCommodity() commodityExist(msg.sender){
        delete warehouse[msg.sender];
        RemoveCommodity(msg.sender);
    }

    function updateCommodity(string name, uint price) commodityExist(msg.sender){
        warehouse[msg.sender].name = name;
        warehouse[msg.sender].price = price;
        warehouse[msg.sender].time = now;
        UpdateCommodity(employeeId);
    }

    function confirmFinish(address seller) commodityExist(seller){
        require(warehouse[seller].buyer == msg.sender);

        warehouse[seller].timeInterval = now.sub(warehouse[seller].time);
        warehouse[seller].isFinish = true;
        seller.transfer(warehouse[seller].price);
        GetConfirm(seller);
    }

    function getCommodity() commodityExist(msg.sender) returns (string name, string url, uint price){
        name =  warehouse[msg.sender].name;
        url = warehouse[msg.sender].url;
        price = warehouse[msg.sender].price;
    }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文