繁体   English   中英

如何在按钮点击承诺中实现价值反应?

[英]How to render value in promises on button click in react?

我有两个模块

App.jsx

import React from 'react';
import ReactDOM from 'react-dom';
import {accounts} from './contract.jsx';


class App extends React.Component{
    constructor(props){
    super(props);
    this.state={'text':'','accounts':'','clicked':false};
}
componentDidMount = () => {
    this.setState({'accounts':accounts()});
}
buttonAction = (e) => {
    this.setState({'clicked':true});
}
render(){
    return(
    <div align="center">
    <Button name="get all Accounts" action={this.buttonAction}/>
    {this.state.clicked ? <div>{this.state.accounts}</div> : null}
    </div>
    )}
}


const Button = (props) =>
    (<button onClick={props.action}>{props.name}</button>);

ReactDOM.render(<App/>,document.getElementById('root'));

和contract.jsx

import Web3 from 'web3';
var web3 = new Web3(Web3.givenProvider || 'http://localhost:8545');

let accounts = () => {
    // this is a promise
    web3.eth.getAccounts().then(function(result){console.log(result);})
    .catch(function(error){console.log(error.message)})
}
export {accounts};

我正在将accounts (promise)函数从contract.jsx导出到app.jsx 由于我无法从诺言中返回值,因此需要将值分配给诺言中的App组件状态(请检查componentDidMount )。 为此,我需要将accounts函数中的'console.log(result)'替换为'this.setState({'accounts':result})''。 但是组件和accounts位于不同的模块中,并且应该是独立的。 我无法在accounts功能中设置App组件的状态。

如何在App组件中将承诺中的值分配给我的状态? 还有其他更好的方法吗? 我还可以使用一些代码更正来使我的组件更好地工作。

这有点hacky,但是您可以尝试将构造函数和呈现函数更改为:

constructor(props) {
  super(props);
  this.state = {
    'text': '',
    'accounts': null,
    'clicked': false
  };
}

...

render() {
  return(
    <div>
      { this.state['accounts'] ? (
          <div align="center">
            <Button name="get all Accounts" action={this.buttonAction}/>
            {this.state.clicked ? <div>{this.state.accounts}</div>:null}
          </div>
        ) : null 
      }
    </div>
  )
}

componentDidMount函数触发时,它将触发重新渲染。 要存储promise返回的值,只需在contract.jsx执行以下操作:

let accounts = () => {
  return web3.eth.getAccounts()
    .then( function(result) {
      return result; // Or it could be result.data, it depends
    }).catch( function(error) {
      console.error(error.message)
    });
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM