Как переопределить функцию обработчика событий дочернего компонента из родительского компонента в файле response.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 по умолчанию с обработчиком компонента поиска. Но this.handleClick указывает на обработчик события компонента кнопки.. пожалуйста, помогите.. Мне нужно ОТ ПОИСКА по клику, а я получил ОТ КНОПКИ..

Ответ 1

Вы на 99% процентов.

React использует односторонний поток данных. Таким образом, события на вложенных компонентах не будут распространяться среди их родителей.

Вы должны распространять события вручную

Измените функцию <Button> handleClick для вызова функции this.props.handleClick, переданной из нее <Search> parent:

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

  ...

});

Прикрепленный является скрипкой вашего оригинального сообщения с требуемым изменением. Вместо регистрации FROM BUTTON он будет предупреждать searching.

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

Ответ 2

Вам нужно изменить свой компонент 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 prop при создании экземпляра Button, он будет иметь предпочтение по методу Button handleClick.