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

4

3 回答 3

4

你在那里的百分之九十九。

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

您必须手动传播事件

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

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

  ...

});

附件是您原始帖子的小提琴,并进行了必要的更改。FROM BUTTON它现在会发出警报,而不是记录searching

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

于 2014-06-22T22:21:17.417 回答
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'handleClick方法。

于 2014-01-19T14:41:56.627 回答
0

或者如果你可以同时执行它们,你可以把

class Button extends React.Component {


handleClick = () => {
console.log("from buttom");

if (this.props.hasOwnProperty('onClick')){
   this.props.onClick();
}

};

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

于 2018-11-08T12:50:48.877 回答