如何从react.js中的父组件覆盖子组件的事件处理函数

时间:2014-01-17 07:50:56

标签: event-handling reactjs

/** @jsx React.DOM */

var Button = React.createClass({
  handleClick: function(){
    console.log(' FROM BUTTON')
  },
  render: function() {
    return <input type='button' onClick={this.handleClick} value={this.props.dname}/>;
  } 
});

var Text = React.createClass({
  render: function() {
    return <input type='text' onClick={this.handleClick} value={this.props.ival}/>;
  } 
});


var search = React.createClass({
  handleClick: function() {
    console.log('searching')
  },
  render: function(){
    return (
      <div>
        <Text/>
        <Button dname={this.props.dname} onClick={this.handleClick} />
      </div>
    );
  }
});

React.renderComponent(<search dname='Look up' fname='Search'/> , document.body);

我创建了一个按钮和文本组件,并将它们包含在搜索组件中,现在我想要使用搜索组件的处理程序覆盖按钮的默认handleClick事件。 但是this.handleClick指向按钮组件的事件处理程序..请帮助.. 我需要从点击搜索而不是我从FROM按钮..

3 个答案:

答案 0 :(得分:4)

你占99%。

React使用one-way data-flow。因此,嵌套组件上的事件不会传播给其父组件。

您必须手动传播事件

更改您的<Button> handleClick函数,以调用从this.props.handleClick父级传入的<Search>函数:

var Button = React.createClass({
  handleClick: function () {
    this.props.onClick();
  },

  ...

});

附件是您原始帖子的小提琴,带有所需的更改。它现在不会记录FROM BUTTON,而是提醒searching

http://jsfiddle.net/chantastic/VwfTc/1/

答案 1 :(得分:1)

您需要更改Button组件以允许此类行为:

var Button = React.createClass({
  handleClick: function(){
    console.log(' FROM BUTTON')
  },
  render: function() {
    return (
      <input type='button'
        onClick={this.props.onClick || this.handleClick}
        value={this.props.dname} />
    );
  }   
});

请注意onClick={this.props.onClick || this.handleClick}

这样,如果您在实例化onClick时传递Button道具,则会优先于Button的{​​{1}}方法。

答案 2 :(得分:0)

或者如果您可以同时执行它们,则可以放

UNION

};

您将检查对象是否具有指定的属性并运行它