文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
使用 Event
使用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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论