【问题标题】:React: How to listen to child component eventsReact:如何监听子组件事件
【发布时间】:2015-05-07 09:30:15
【问题描述】:

我有一个组件,假设它包含一个表单。该表单具有子组件,它们本质上是用于输出文本输入和选择菜单的 UI 小部件。

选择菜单组件有点花哨,并使用 onChange 事件进行一些状态维护。

我的问题是;如何从父(表单)组件中连接到选择菜单的 onChange 事件?我不能通过 props 传递 onChange,因为我已经在 select 组件中指定了 onChange,我不想覆盖它。

例子:

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>
        );
    }
});

【问题讨论】:

  • "我有一个组件,假设它包含一个表单。"请发布实际组件的代码。

标签: javascript reactjs


【解决方案1】:

使用 &lt;Select onChange={...} /&gt; 不会覆盖 Select 的 render 方法中的 &lt;select onChange={...} /&gt;&lt;Select/&gt; 组件和它渲染的&lt;select/&gt; 组件具有完全不同的props 集。

我认为,做你想做的最简单的方法是让你的 Select 的handleChange 方法调用this.props.onChange。您可以传递相同的 e 参数 handleChange 接收:

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>
    );
  }
});

【讨论】:

  • 为什么要加if (this.props.onChange)
  • @KirkStrobeck 因为如果没有 onChange 属性传递给组件,this.props.onChange(e) 将抛出错误。
  • 嗯,我无法重现你在 react 0.14.7 中提到的错误
  • 我无法解释这一点。如果你在this.props.onChangeundefined 时调用this.props.onChange(e),你会得到一个错误。如果你没有收到错误,那么要么你没有打电话,要么它不是未定义的。
  • @JohnnyQ 你应该这样做“当它应该总是被定义的时候”。当您希望道具是可选的时,您应该这样做。
猜你喜欢
  • 2018-04-30
  • 2019-07-20
  • 2017-02-21
  • 1970-01-01
  • 2017-09-14
  • 2022-11-23
  • 1970-01-01
  • 1970-01-01
  • 2016-12-06
相关资源
最近更新 更多