【问题标题】:Access an object inside another object returns cannot read property of undefined访问另一个对象内的对象返回无法读取未定义的属性
【发布时间】:2020-01-13 21:33:53
【问题描述】:

我有一个小问题,但由于某种原因我无法解决。

我有一个对象,它是来自 API 的返回请求:

state = { 
        data: []
    }

    componentDidMount() {
        fetch(`https://api.openweathermap.org/data/2.5/weather?q=Toronto,CA&appid=${appkey}`)
        .then(data => data.json())
        // .then((data) => {
        //  console.log(data);
        // })
        .then(data => this.setState({data}))

    }

和:

render() {
const weather = this.state.data
console.log(weather.main);

第一部分是反应组件之前的第一个部分。我能够获取一个对象,然后创建一个返回另一个对象的变量 (const),在这种情况下:

{feels_like: 271.85
temp_min: 272.15
temp_max: 276.48
pressure: 1027
humidity: 97}

由于我的无知,奇怪的是,如果我尝试以这种方式访问​​例如第一个值 (feels_like):

weather.main.feels_like

它会抛出一个错误,即无法读取未定义的属性“feels_like”。

现在,我尝试循环访问该对象,但它不起作用,我尝试使用不同的语法访问该属性,但仍然引发错误。

我错过了什么吗?

目标是创建一个这样的组件:

console.log(this.state.data);
 const weather = this.state.data;
 return (

  <div>
  <div key={weather.id}>
  <h3>Library Product of the Week!</h3>
  <h4>{weather.name}</h4>
  <h4>{weather.main.temp}</h4>
  <h4>{weather.main.feels_like}</h4>
  <h4>{weather.main.temp_min}</h4>
  <h4>{weather.main.temp_max}</h4>
  <h4>{weather.main.pressure}</h4>
  <h4>{weather.main.humidity}</h4>
  </div>
  </div>
  )
}

这是完整的代码:

import React from 'react'
 import { render } from 'react-dom'

 const appkey = 'xx';

 class Message extends React.Component {

    state = { 
        data: []
    }

    componentDidMount() {
        fetch(`https://api.openweathermap.org/data/2.5/weather?q=Toronto,CA&appid=${appkey}`)
        .then(data => data.json())
        // .then((data) => {
            //  console.log(data);
            // })
            .then(data => this.setState({data}))

        }

        componentDidUpdate() {
            console.log("The component just updated")
        }

        render() {
            console.log(this.state.data);
            const weather = this.state.data;
            return (

                <div>
                <div key={weather.id}>
                <h3>Library Product of the Week!</h3>
                <h4>{weather.name}</h4>
                <h4>{weather.main.temp}</h4>
                <h4>{weather.main.feels_like}</h4>
                <h4>{weather.main.temp_min}</h4>
                <h4>{weather.main.temp_max}</h4>
                <h4>{weather.main.pressure}</h4>
                <h4>{weather.main.humidity}</h4>
                </div>
                </div>
                )
        }
    }

    render(
        <Message />, 
        document.getElementById('root')
        )

【问题讨论】:

  • 您尝试访问object1.main.feels_like的时间和地点?
  • 看起来data 被初始化为一个数组,但作为一个对象访问。你期望它是哪个?你能提供data的注释掉的控制台日志吗?

标签: javascript reactjs object


【解决方案1】:

从您提供的代码看来,您似乎在数据第一次保存到状态之前就已经在访问数据了。因此,您试图从作为初始状态的空数组中获取 feel_like 值。

为了修复它,您应该在渲染方法中使用它之前检查您的数据是否存在

编辑:

由于某种原因,API 密钥对我不起作用,并且文档提到它可能需要几个小时才能起作用,因此我无法为您进行测试。但是the code sandbox 在渲染数据之前会检查数据是否存在。如果数据未初始化,它将呈现一些文本。希望这会有所帮助!

【讨论】:

  • 我放了整个代码来解释它发生了什么。实际上,如果我尝试访问对象的第一级,它就可以工作。这就是让我发疯的部分
  • 嗯,这似乎很奇怪,据我所知不应该。无论哪种方式,您都应该在使用渲染组件中的数据之前检查信息是否存在。我希望它能解决你的错误。或者至少解决您在修复此错误后将收到的错误。
  • 它确实有效,但仅适用于第一级,您可以尝试使用apikey
  • 这就是为什么我无法访问对象的第二级对我来说很奇怪
  • Object temp: 274.19feels_like: 271.6temp_min: 272.04temp_max: 275.93pressure: 1027humidity: 97__proto__: Object 这是 const weather2 = this.state.data 的结果; console.log(weather2.main);
猜你喜欢
  • 1970-01-01
  • 2018-02-04
  • 1970-01-01
  • 2020-08-06
  • 2021-11-18
  • 2019-05-21
  • 1970-01-01
  • 2021-11-02
  • 2021-04-30
相关资源
最近更新 更多