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


/** @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指向按钮组件的事件处理程序。请帮忙..我需要从点击搜索,而不是从按钮。

你99%在那里。

React 使用单向数据流。 因此,嵌套组件上的事件不会传播到其父级。

必须手动传播事件

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

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

附上是原始帖子的小提琴,进行了所需的更改。 它现在不会记录FROM BUTTON,而是会提醒searching

http://jsfiddle.net/chantastic/VwfTc/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}

这样,如果你在实例化Button时传递一个onClick道具,它将优先于ButtonhandleClick方法。

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

class Button extends React.Component {

handleClick = () => {
console.log("from buttom");
if (this.props.hasOwnProperty('onClick')){
   this.props.onClick();
}

};

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

相关内容

  • 没有找到相关文章

最新更新