2015-03-05 3 views
5

У меня есть компонент, допустим, он содержит форму. Форма имеет дочерние компоненты, которые по существу являются виджетами пользовательского интерфейса для вывода текстовых входов и выбора меню.React: Как прослушивать события дочерних компонентов

Компоненты меню выбора немного причудливы и поддерживают некоторое состояние, используя событие onChange.

Мой вопрос: как я могу подключиться к событию onChange для меню выбора из компонента parent (form)? Я не могу передать значение через реквизит, поскольку у меня уже есть onChange, указанный внутри компонента select, и я не хочу его переопределять.

Пример:

var Form = React.createClass({ 

    handleSelectChange: function(){ 
     // Do something when <Select /> changes 
    }, 

    render: function() {  

     var selectMenuOptions = [ 
      {label: 'Choose...', value: ''}, 
      {label: 'First option', value: 'one'}, 
      {label: 'Second option', value: 'two'} 
     ]; 
     return (
      <form> 
       <Select name="selectMenu" id="selectMenu" options={selectMenuOptions} /> 
      </form> 
     ); 
     } 
}); 

var Select = React.createClass({ 

    getDefaultProps: function() { 
     return { 
      options: [], 
      className: "select" 
     }; 
     }, 

    getInitialState: function() { 
     return { 
      buttonText: 'Loading...', 
      defaultValue: null 
     }; 
    }, 

    handleChange: function (e) { 
     // Update buttonText state 
    }, 

    render: function() { 

     return (
      <div className={this.props.className}> 
       <div className="select__button">{this.state.buttonText}</div> 
       <select className="select__selector" 
         ref="select" 
         onChange={this.handleChange}> 
         {this.props.options.map(function(option, i){ 
          return (<Option option={option} key={i} />); 
         })} 
       </select> 
      </div> 
     ); 
    } 
}); 
+0

«У меня есть компонент, скажем, она содержит форму.» Пожалуйста, разместите код для фактических компонентов. –

+0

Пример кода добавлен. – Simon

ответ

7

<Select onChange={...} /> Использование не будет перекрывать <select onChange={...} /> внутри render Выбор способа в. Компонент <Select/> и компонент <select/>, который он представляет, имеют совершенно разные наборы props.

Самый простой способ сделать то, что вы хотите, я думаю, состоит в том, чтобы вызвать метод выбора handleChangethis.props.onChange. Вы можете просто передать это тот же самый аргумент ehandleChange получает:

var Form = React.createClass({ 
    handleSelectChange: function(){ 
    // Do something when <Select /> changes 
    }, 

    render: function() { 
    // ... 
    return (
     <form> 
     <Select name="selectMenu" 
      id="selectMenu" 
      options={selectMenuOptions} 
      onChange={this.handleSelectChange} /> 
     </form> 
    ); 
    } 
}); 

var Select = React.createClass({ 
    // ... 

    handleChange: function (e) { 
    if (this.props.onChange) { 
     this.props.onChange(e); 
    } 
    // Update buttonText state 
    }, 

    render: function() { 
    return (
     <div className={this.props.className}> 
     <div className="select__button">{this.state.buttonText}</div> 
     <select className="select__selector" 
      ref="select" 
      onChange={this.handleChange}> 
      {this.props.options.map(function(option, i){ 
      return (<Option option={option} key={i} />); 
      })} 
     </select> 
     </div> 
    ); 
    } 
}); 
+0

Зачем добавлять 'if (this.props.onChange)'? –

+0

@KirkStrobeck Потому что, если никакая команда 'onChange' не была передана компоненту,' this.props.onChange (e) 'выдаст ошибку. –

+0

Хм, я не могу воспроизвести ошибку, которую вы упомянули в ответ 0.14.7 –

Смежные вопросы