【问题标题】:React JS - event handling for mapped objectsReact JS - 映射对象的事件处理
【发布时间】:2016-04-13 09:05:09
【问题描述】:

我正在尝试找出一种方法来从已映射到父组件的子组件传递 (event.target)。问题是,当我映射它时,我尝试用“this”设置的任何属性都变得未定义。

示例:

var OptionChoices = [
  {value: 'bad', label: "Select a field"},
  {value: 'blue', label: "Blue"},
  {value: 'red', label: "Red"},
  {value: 'green', label: "Green"},
  {value: 'pink', label: "Pink"}
  ];

var CategoryRow = React.createClass({
  getInitialState: function () {
    return{array : [{order: "1"}]};
    },
  onChange: function(event){
    console.log("YAY");
    },
  render: function() {
    return (
      <div className={this.props.categoryClass}>
        <h3>{this.props.text}</h3>
        {this.state.array.map(function(option){
          return (
            <Dropdown onChange={this.onChange} options={OptionChoices} key={option.order} />
            );
        })}
    </div>
    );
  }
});

var Dropdown = React.createClass({
  getInitialState: function () {
    return{firstTime: true};
  },
  onChange: function(event){
    var x = event.target;
    if (this.state.firstTime===true) {
      if (typeof this.props.onChange === 'function') {
        this.props.onChange(event.target);
    }
  }
    this.setState({firstTime: false});
  },
  render: function() {
    return (
      <select onChange={this.onChange} className={this.props.dropdownClass}>
        {this.props.options.map(function(option){
          return (
              <Option value={option.value} key={option.value}>{option.label}</Option>
            );
        })}
    </select>
    );
  }
});

现在我收到一个错误“无法读取未定义的属性 'onChange'”

任何/所有想法都表示赞赏。谢谢!

【问题讨论】:

    标签: javascript reactjs


    【解决方案1】:

    这是因为在 map 函数中, this 不引用外部上下文(您的组件)。

    要解决这个问题,你需要告诉 map 函数使用什么上下文。你可以这样做(注意最后的 this):-

    this.state.array.map(function(option){
          return (
            <Dropdown onChange={this.onChange} options={OptionChoices} key={option.order} />
            );
        }, this)
    

    或者,如果您使用的是 ES6,则可以使用箭头函数(捕获封闭上下文的“this”值)。因此,您的地图将转换为:-

    this.state.array.map(option => {
          return (
            <Dropdown onChange={this.onChange} options={OptionChoices} key={option.order} />
            );
        })
    

    【讨论】:

    • 您还需要将bind(this) 发送到您的onChange 以允许在该处理程序中使用this。实际上,这可能已经在较新版本的 reactjs 中被编辑掉了
    猜你喜欢
    • 2023-01-07
    • 2020-12-29
    • 2019-04-10
    • 1970-01-01
    • 2015-04-15
    • 2022-11-04
    • 2022-11-10
    • 1970-01-01
    相关资源
    最近更新 更多