开发者问题收集

React.JS 无法读取数组循环内的属性

2015-07-25
2018

我有以下代码。

 var ImageList = React.createClass({
 getComponent: function(index){
      console.log(index);
 },
render: function() {
var results = this.props.data;
return (
  <div className="row">
    {results.map(function(result) {
      return(
              <a className="th medium-3 columns" href="#" onClick=  {this.getComponent.bind(this, 1)}>
                <img alt="Embedded Image" key={result.id} src={"data:" + result.type + ";"  + "base64," + result.image} />
              </a>
      )      
    })}
  </div>
);
}
});

第二个返回函数基本上循环显示一个图像数组。我希望单击时 OnClick 事件应触发 getComponent 方法。但是,如果 OnClick 事件在数组循环内,则会引发以下错误:

Uncaught TypeError: Cannot read property 'getComponent' of undefined.

但是,如果我使用相同的代码,即使在循环函数之后也只需添加 onClick ,如下所示:

 var ImageList = React.createClass({
 getComponent: function(index){
      console.log(index);
 },
render: function() {
var results = this.props.data;
return (
  <div className="row">
    {results.map(function(result) {
      return(
              <img alt="Embedded Image" key={result.id} src={"data:" + result.type + ";"  + "base64," + result.image} />
      )      
    })}
    <a className="th medium-3 columns" href="#" onClick=  {this.getComponent.bind(this, 1)}>
  </div>
);
}
});

最终工作正常。但由于我只需要为每个图像保留一个唯一的 ID,然后我才能完成 getComponent 的剩余功能,第二种方法对我来说没什么用。因此,有没有办法让它在循环中工作?

2个回答

您的范围在 .map 方法内发生变化:

{results.map(function(result) {
    // `this` is different inside this anonymous function
})}

您要做的就是使用 ES6 的胖箭头语法,它会自动创建一个具有相同范围的匿名函数 ,或者将当前范围存储在变量中:

ES6 胖箭头( 在此处阅读更多信息 ):

render: function() {
    var results = this.props.data;
    return (
      <div className="row">
        {results.map( (result) => {
            return(
                <a className="th medium-3 columns" href="#" onClick={that.getComponent.bind(that, 1)}>
                    <img alt="Embedded Image" key={result.id} src={"data:" + result.type + ";"  + "base64," + result.image} />
                </a>
            )
        })}
      </div>
    );
    }
});

请注意,您需要一个转译器(例如 babel.io)将其更改为浏览器当前可以理解并运行的 ES2015。这被认为是“最佳实践”,因为 ES6/7 为 JS 带来了更好的功能。

存储对此的引用:

render: function() {
    var results = this.props.data,
        that = this;
    return (
      <div className="row">
        {results.map(function(result) {
            return(
                <a className="th medium-3 columns" href="#" onClick={that.getComponent.bind(that, 1)}>
                    <img alt="Embedded Image" key={result.id} src={"data:" + result.type + ";"  + "base64," + result.image} />
                </a>
            )
        })}
      </div>
    );
    }
});
tonyhb
2015-07-25

您可以使用 ES6 箭头函数自动保留此上下文:

results((result) => { ... })

或者仅将 this 作为第二个参数传递给 map

results(function(result) { ... }, this)

Aleksandras
2016-05-24