ReactJS-TypeError:无法读取未定义的属性“ 0”

时间:2018-12-31 21:27:11

标签: reactjs

我正在尝试制作一个天气应用程序,以学习一些ReactJS。

我在componentDidMount组件内部的WeatherCard方法中使用此提取调用了 OpenWeatherMap API。

constructor() {
    super()
    this.state = {
        weatherData: {}
    }
}

componentDidMount() {
    fetch('//api.openweathermap.org/data/2.5/weather?q=Calgary,ca&APPID=XXX')
    .then(response => response.json())
    .then(data => {
        this.setState({
            weatherData: data
        })
    })
}

以下是上述调用的示例JSON输出(给出了有效的API密钥):

enter image description here

每当我要访问天气属性时,都会收到此错误消息:

  

TypeError:无法读取未定义的属性“ 0”

...,我这样访问它:

this.state.weatherData.weather[0].main

如果可以解决问题,这里也是我的渲染方法:

render() {
    return (
        <div>
            {this.state.weatherData.weather[0].main}
        </div>
    )
}

有人知道我遇到的问题是什么吗?非常感谢!

4 个答案:

答案 0 :(得分:2)

您什么时候尝试访问它?

您能尝试一下吗?

render() {
    return (
        <div>
            {this.state.weatherData.weather ? this.state.weatherData.weather[0].main : null}
        </div>
    )
}

答案 1 :(得分:1)

在数据完成提取之前,render()方法可能试图访问this.state.weatherData。如果仅在数据存在时才显示,请尝试使用内联:

<div>
  {this.state.weatherData &&
    <p>{this.state.weatherData.weather[0].main}</p>
  }
</div>

答案 2 :(得分:1)

在第一个渲染上,请求尚未开始,因此尚无数据,您需要具有一个加载布尔值,或者只是在尝试访问它之前检查是否已加载数据。

render() {
    if (!this.state.weatherData.weather) {
        return <span>Loading...</span>;
    }

    return (
        <div>
            {this.state.weatherData.weather[0].main}
        </div>
    )
}

答案 3 :(得分:0)

您必须考虑到 this.state.weatherData.weather 可能是 undefinednull

应该试试这个:

{this.state.weatherData.weather ? this.state.weatherData?.weather[0].main : null}