在componentDidMount之外进行异步反应

时间:2019-03-16 20:00:19

标签: reactjs redux react-redux react-thunk

可以在react组件中在componentDidMount()外部使用异步

我有这样的东西

  async componentDidMount() {
    this.props.functionA();
  }

const mapDispachToProps = dispatch => {
  return {
    functionA: () => dispatch(actionCreator.someStuff())
  };
};

export const someStuff= () => async (dispatch) => {
  try {
    const xyz= await callingsomepromise();
    ...

现在,如果我调用functionA在componentDidMount()的其他地方,它将无法正常工作。 我的问题是,如何在其他部分调用functionA,例如单击按钮后。

1 个答案:

答案 0 :(得分:1)

您可以从事件处理程序中调用它,例如onClick或任何React组件生命周期挂钩,例如componentdidupdate。 甚至在构造函数中……

简单地:

class MyComp extends React.Component {
  constructor(props) {
    super(props)
    this.props.functionA();
  }
  componentDidMount() {
    ...
  }

  onClick() {
    this.props.functionA()
  }

  componentDidUpdate(prevProps) {
    if(somecondition) {
      this.props.functionA();
    }
  }

  render() {
    return <div onClick={this.onClick.bind(this)} />;
  }

}

如果您需要等待一些异步操作,例如,只需使用async / await即可。承诺解决。

class MyComp extends React.Component {

  async onClick() {
    await this.props.functionA()
    doSomethingAfter()
  }

  render() {
    return <div onClick={this.onClick.bind(this)} />;
  }

}

编辑-像这样调用redux动作:

import { actionName } from 'actions/myactions';

然后从您的组件中调用它:

class MyComp extends React.Component {
  onClick() {
    this.props.functionA()
  }

  render() {
    return <div onClick={this.onClick.bind(this)} />;
  }
}

然后将功能绑定到您的操作并连接到redux:

const mapDispatchToProps = dispatch => ({
  FunctionA: () => dispatch( actionName() )
});

现在将您的组件连接到您的映射动作和redux存储:

export default connect( mapStateToProps, mapDispatchToProps )( MyComp );