当前位置: 首页 > 面试题库 >

如何将事件处理程序传递给React中的子组件

康鹏云
2023-03-14
问题内容

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

我试图弄清楚如何将事件处理程序从父组件传递到<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)}/>

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

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

问题答案:

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

作为示例,我添加了一个小片段来显示其工作方式

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>

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



 类似资料:
  • 问题内容: 我使用React Router的React.js应用程序具有以下结构: 我想将一些属性传递给组件。 (通常我会这样做) 用React Router做到这一点最简单,正确的方法是什么? 问题答案: 更新 自新版本发布以来,无需使用包装器就可以直接通过组件传递道具。例如,通过使用prop。 零件: 用法: 旧版本 我的首选方式是包装组件并将包装器作为路由处理程序传递。 这是您应用了更改的示

  • 问题内容: 所以我试图使反应与ES6语法一起工作。在ES5中,我有setInitialState,而没有使用函数绑定语法的构造函数。我有一个价格列表,该价格是任意的,并且我希望状态在输入元素发生更改时发生变化。但是正确的价格必须改变。 我什至不确定这是否是正确的方法。有人可以告诉我最近应做的事情吗? 这是我的代码: 这是错误… 问题答案: 您绑定的功能不正确 在构造函数中,您无需指定参数,只需要像

  • 所以我试图用ES6语法使反应工作。在ES5中,我没有使用函数绑定语法的构造函数。我有一个任意的价格列表,当输入元素改变时,我希望状态改变。但是正确的价格必须改变。 我甚至不确定这是正确的方法。有人能告诉我最近应该怎么做吗? 这是我的代码: 这就是错误...

  • 问题内容: // this e works document.getElementById(“p”).oncontextmenu = function(e) { e = e || window.event; var target = e.target || e.srcElement; console.log(target); }; 也有人提出过类似的问题。 但是在我的代码中, 我试图获取被单击的子

  • 问题内容: 我尝试将函数传递给子组件。当用户单击每个子组件时,将调用onclick函数。此onclick函数将写入父组件。 父组件: 子组件: 在这一行: 它说没有定义handleClick …如何解决这个问题? 感谢您的回答。 问题答案: 您需要将Agents绑定到AgentsList:这是您的代码的一个简单示例,我不得不删除一些东西,但是您明白了: http://jsfiddle.net/vh

  • 本文向大家介绍怎样将事件传递给子组件?相关面试题,主要包含被问及怎样将事件传递给子组件?时的应答技巧和注意事项,需要的朋友参考一下 这道题出的有问题。 一般情况下我们父组件向子组件传递的不是事件,而是事件处理函数