【问题标题】:How to pass an event handler to a child component in React如何将事件处理程序传递给 React 中的子组件
【发布时间】:2016-10-06 20:07:29
【问题描述】:

我在 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)}/>

【问题讨论】:

  • 只需{this.register} 即可,只需在该注册方法中获取用户的状态(无需作为参数传递)
  • 你能扩展一下吗?我也没有运气让 onClick 事件处理程序与其他组件一起工作。
  • 嗯,finalfreq 已经给出了一个很好的例子。为了提供更多细节,看看父组件是如何实现的会很方便。在他的情况下,您将事件处理程序作为道具传递给子组件,然后子组件调用父控件上的函数

标签: javascript reactjs


【解决方案1】:

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

作为一个例子,我添加了一个小sn-p来展示它是如何工作的

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')
);
<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>

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

【讨论】:

  • 所以您对提交方法的评论提醒我,它们通常用于表单,而不是按钮。我最终为表单创建了一个更“语法正确”的输入 type="submit" 组件,然后离开 Button 组件来管理仅在“点击”事件上触发的操作。然后我将 onSubmit 事件处理程序留在表单上,​​而不是将其传递给子组件。
【解决方案2】:

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

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

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

然后在a标签上

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-05
    • 1970-01-01
    • 2018-10-24
    • 2021-12-30
    • 2019-12-17
    • 2019-03-26
    • 2019-12-11
    • 2021-09-07
    相关资源
    最近更新 更多