this.props返回undefined with array.map((item,i)

时间:2017-06-19 23:49:04

标签: javascript reactjs react-jsx react-proptypes

我试图将给定数组项的内容作为prop传递,然后使用它来触发某些REST函数,但是当我稍后通过item.roomconsole.log(this.props.myProp)时,我发现了什么打印未定义。我已经按照我可以一步一步找到的每一种资源,但似乎道具正在困扰我的控制台。请帮忙!

代码失败;

class Lights extends Component {
  lumin()  {
    console.log(this.props.lumer + " clicked!")
  }
  render() {
    return(
      <div className="Lights">
        <div className="link-wrapper">
          {[
            {
              room: 'Office'
            },
            {
              room: 'Office Bathroom'
            },
            {
              room: 'Neekon Bedroom'
            },
            {
              room: 'Ryan Room'
            },
            {
              room: 'Homework Room'
            },
            {
              room: 'Living Room'
            },
            {
              room: 'Gallery'
            },
            {
              room: 'Guest Bathroom'
            },
            {
              room: 'Dining Room'
            },
            {
              room: 'Kitchen'
            },
            {
              room: 'Master Bedroom'
            },
            {
              room: 'Family Room'
            }
          ].map((item, i) => {
            return (
              <a onClick={this.lumin.bind(this)} lumer={item.room} className="toggle-text">
              {item.room}</a>)
          })}
        </div>
      </div>
    )
  }
}

1 个答案:

答案 0 :(得分:1)

您的问题是您正在尝试从父组件查看子组件的props。您的lumin()组件位于Lights组件上,但您将lumer作为道具传递到<a>组件。

最简单的解决方法是取代

onClick={ this.lumin.bind(this) }

代替:

onClick={ () => this.lumin(item.room) }

直接将房间传递给函数(不要尝试阅读this.props.lumer)。

但是,更合适的解决方案是使用自定义组件替换<a>,然后将lumin()函数移到其中。

// Lights component
[].map(item => <RoomLight lumer={ item.room } key={ i } />)

// RoomLight component
class RoomLight extends React.Component {
    lumin() { console.log(this.props.lumer + ' clicked'); }

    render() {
      return <a onClick={ this.lumin.bind(this) }>{ this.props.lumer }</a>;
    }
}

理想情况下,渲染时不要使用箭头功能。它创造了性能打击。相反,bind()在构造函数中:

class RoomLight extends React.Component {
    lumin() { console.log(this.props.lumer + ' clicked'); }

    constructor(props) {
      super(props);

      this.lumin = this.lumin.bind(this);
    }

    render() {
      return <a onClick={ this.lumin }>{ this.props.lumer }</a>;
    }
}