用外部函数反应componentdidmount返回状态

时间:2018-08-29 15:08:57

标签: javascript reactjs

我正在从API获取数据,但似乎无法获得onClick侦听器来处理返回的结果

  async componentDidMount() {
    const response = await fetch('/api/mediabuys');
    await response.json().then(data => {
      let markets = data.mediabuys.map(function(item)  {
        return(
          <tr key={item.id}>
            <td onClick={this.openWindow.bind(this)}>{item.name}</td>
          </tr>
        )
      })
      this.setState({markets: markets});
    })
  }

  openWindow() {
    console.log('a');
  }

我收到的错误是:

Uncaught (in promise) TypeError: Cannot read property 'openWindow' of undefined

如果我将this.openWindow添加到ComponentDidMount的开头,则它能够运行该函数,并且我在构造函数中也有this.openWindow = this.openWindow.bind(this)。如何获取onClick以查看该功能?

4 个答案:

答案 0 :(得分:1)

更改

 function(item)  {

 item => {

以防止上下文丢失。

答案 1 :(得分:1)

这是因为您当前绑定到本地范围。更改:

function(item)  {

收件人:

(item) => {

箭头功能将允许您访问父范围。

答案 2 :(得分:0)

您不需要两次绑定this,因此只需将this.openWindow传递给onClick属性就足够了。 https://reactjs.org/docs/handling-events.html 同样,function文字将不会绑定this,因此您需要使用新的箭头语法为map传递函数。

答案 3 :(得分:0)

使用.map绑定传递给this的匿名函数。或使用 Arrow 函数。

let markets = data.mediabuys.map(function (item) {
  return (
    <tr key={item.id}>
      <td onClick={this.openWindow}>{item.name}</td>
    </tr>
  )
}.bind(this))

或者,

let markets = data.mediabuys.map( (item) => {
  return (
    <tr key={item.id}>
      <td onClick={this.openWindow}>{item.name}</td>
    </tr>
  )
})

通过两种方式,传递给map函数的函数都可以访问外部上下文this