如何在React

时间:2016-10-06 20:07:30

标签: javascript reactjs

我在React中创建了一个<Button />组件,它在我的应用程序中抽象出一些样式。我在两个不同的上下文中使用它 - 一个用于提交登录表单,另一个用于导航到注册页面(以及将来可能的其他上下文)。

我试图弄清楚如何将事件处理程序从父组件传递到<Button />。我想为登录表单调用onSubmit处理程序,但为导航按钮调用onClick处理程序。这可能吗?

我试过这样调用组件:

<Button text={callToAction} style={styles.callToActionButton} onClick={() => FlowRouter.go("Auth")}/>

<Button text="Go!" style={styles.registerButton} onSubmit={() => this.register(this.state.user, this.state.password)}/>

我也尝试删除箭头函数,这只会导致函数在加载组件时执行:

// executes event handlers on page load
<Button text={callToAction} style={styles.callToActionButton} onClick={FlowRouter.go("Auth")}/>

<Button text="Go!" style={styles.registerButton} onSubmit={this.register(this.state.user, this.state.password)}/>

2 个答案:

答案 0 :(得分:15)

通常,您可以将onClick处理程序作为属性传递给您的按钮类。你可以通过简单地定义按钮组件的propTypes来制作一个必需的道具。

例如,我添加了一个显示其工作原理的小片段

&#13;
&#13;
var StyledButton = React.createClass({
  propTypes: {
    // the StyledButton requires a clickHandler
    clickHandler: React.PropTypes.func.Required,
    // and I guess the text can be seen as required as well
    text: React.PropTypes.string.required
  },
  render: function() {
    // as you are sure you have a clickHandler, you can just reference it directly from the props
    return <button type="button" onClick={this.props.clickHandler}>{this.props.text}</button>;
  }
});

var MyForm = React.createClass({
  getInitialState() {
    return {
      clicked: 0
    };
  },
  click() {
    this.setState({clicked: this.state.clicked+1});
  	alert('ouch');
  },
  secondClickHandler() {
    this.setState({clicked: 0});
    alert(':(');
  },
  render() {
    // your parent component simply sets which button  
    return <fieldset>
        <div>
    	  <StyledButton clickHandler={this.click} text="Click me" /> 
          { (this.state.clicked > 0) && <StyledButton clickHandler={this.secondClickHandler} text="Not again" /> }
        </div>
    </fieldset>;
  }
});

ReactDOM.render(
  <MyForm />,
  document.getElementById('container')
);
&#13;
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.0.2/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.0.2/react-dom.min.js"></script>
<div id="container">
    <!-- This element's contents will be replaced with your component. -->
</div>
&#13;
&#13;
&#13;

此外,您通常不会使用按钮的提交方法,而是希望将收到的数据发送到Web服务,并在收到结果时处理任何更改。提交会杀死当前网站并需要重新加载所有内容,而使用ajax调用或商店时,它可以等待结果,然后根据响应重定向用户

答案 1 :(得分:3)

我们如何处理这个问题是我们有一个按钮组件呈现一个标签,然后我们有一个href prop和一个你可以传入的onClick prop。如果它的链接只是将href prop传递给按钮,如果你希望它执行一个函数只是在onClick prop中传递它,并确保它在a标签上设置。

在Button组件中,我们还设置了一个自定义onClick函数,如下所示:

_onClick: function(e) {
  if (!this.props.onClick) {
    return; 
  }
  this.props.onClick(e);
}

然后在标签上

<a href={this.props.href} onClick={this._onClick} />