React:为什么`this.props.children`未定义?

时间:2014-01-03 07:05:57

标签: javascript reactjs

我正在使用ReactJS构建电子电阻计算器。我有一个声明如此的组合组件:

var ResistanceCalculator = React.createClass({
    getInitialState: function() {
        return {bands: [0,0,0,0,0]}
    },
    componentDidMount: function() {
        console.log(this.props.children); // => undefined
    },
    render: function() {
        return (
            <div>
                <OhmageIndicator bands={this.state.bands} />
                <SVGResistor bands={this.state.bands} />
                <BandSelector band={1} />
                <BandSelector band={2} />
                <BandSelector band={3} />
                <BandSelector band={4} />
                <BandSelector band={5} />
            </div>
         );
    }
});

BandSelector呈现<select>元素,当一个更改时,我想更新ResistanceCalculator的状态。所以我的想法是我需要将事件监听器绑定到ResistanceCalculator个孩子。但this.props.children似乎是空的。这是为什么?

1 个答案:

答案 0 :(得分:12)

经验法则是:this.props中的所有内容都会从父级传递给您。 所以你以错误的方式使用this.props.children。如果我有这样的事情:

<Todos><div /><div /></Todos>

然后,对于Todos组件,this.props.children将是divs的数组。

这里你想要的是简单的回调(working example):

/** @jsx React.DOM */
var ResistanceCalculator = React.createClass({
  getInitialState: function() {
      return {bands: [0,0,0,0,0]};
  },

  handleBandSelectionChange: function(bandIndex, newValue) {
    // for the sake of immutability, clone the array here
    var bands = this.state.bands.slice(0);
    bands[bandIndex] = newValue;
    console.log(bandIndex, newValue); // yep, seems to work
    this.setState({bands: bands});
  },

  render: function() {
    return (
      <div>
        <OhmageIndicator bands={this.state.bands} />
        {
          this.state.bands.map(function(value, i) {
            return (
              <BandSelector band={i} onChange={this.handleBandSelectionChange}/>
            );
          }, this)
        }
      </div>
    );
  }
});

var BandSelector = React.createClass({
  handleChange: function(e) {
    if (this.props.onChange)
      this.props.onChange(this.props.band, e.target.value);
  },

  render: function() {
    return (
      <select onChange={this.handleChange}>
        <option value="1">1</option>
        <option value="2">2</option>
      </select>
    );
  }
});

我从select中听到常规的onChange事件,然后在处理程序中调用我父母的处理程序(handleBandSelectionChange)。请注意,对于父级(ResistanceCalculator),事件不必是onChange;它可以是任何名称,只要孩子称之为。将它命名为onChange更好。

作为旁注,this.props.children用于希望在自己做一些工作时透明地呈现内容的包装组件。