javascript - OpenWeatherMap API:无法读取未定义的属性
问题描述
我正在尝试通过 API 调用访问 OpenWeatherMap 的天气信息,但我总是收到“无法读取未定义的属性”错误。
在我的 App.js 文件中,我有一个 CallAPI 函数,用于传递用户坐标并获取天气数据。然后它通过“curr”属性传递给我的 Header 组件。
const [currWeatherData, setCurrWeatherData] = useState({})
useEffect(() => {
navigator.geolocation.getCurrentPosition(CallAPI, showError);
}, [])
//... showError function
function CallAPI(position){
const lat = position.coords.latitude
const long = position.coords.longitude
fetch(/*api call*/)
.then(response => response.json())
.then(data => {
setCurrWeatherData(data.current)
})
}
return (
<div>
<Header curr = {currWeatherData}/>
<div>
)
在我的 Header.js 文件中,我目前只是试图显示天气状态。
import React from "react"
function Header(props){
return(
<div>
{/*<h1>{props.curr.weather[0].main}</h1>*/}
{console.log(props.curr.weather)}
</div>
)
}
API 中 json 文件的开头如下所示。
在“当前”中,有一个天气属性是一个数组,其中一个元素是一个对象,因此我假设访问“主”属性的正确方法是“current.weather[0].main”。但是,当我尝试 console.log 或返回它时,我收到错误“无法读取未定义的属性 '0'”。奇怪的是,当我 console.log "current.weather" 时,它会在控制台上打印一个带有对象的数组。
在访问第 0 个索引之前,我尝试将“current.weather”存储在变量中,并且尝试将“currWeatherData.weather”作为我的 App.js 文件中的道具传递,我认为这两者都不会改变任何东西。我不确定从这里去哪里,有人可以帮忙吗?
编辑:经过一个小时左右的 console.log 调试后,我发现了我的问题。我了解到,当使用钩子时,useState 触发重新渲染的方式与 this.setState 相同,这意味着每次我设置状态时,它都会渲染我的 Header 组件。我猜 API 调用在渲染之前没有完成,所以 prop 作为未定义传递。我通过添加一个 isLoading 状态并在 API 调用后将其设置为 false 来解决这个问题,
//... code above
.then(data => {
setCurrWeatherData(data.current)
setIsLoading(false)
})
在我的回报中,我添加了一个条件语句
<div>
{!isLoading && <Header curr = {currWeatherData}/>}
</div>
我浏览了https://medium.com/swlh/how-does-react-hooks-re-renders-a-function-component-cc9b531ae7f0以提供帮助
解决方案
因为您使用的是功能组件。我建议您添加useEffact(()=> { your api call}, [] )
,这应该可以。因为目前你的代码没有得到你想要的数据!希望这会有所帮助。
推荐阅读
- java - 由于性能原因聚合多个 Hibernate 公式
- c++ - 如何在 librdkafka 中正确重新发送失败的消息?
- r - 从数据框中删除特定的观察结果。这些特定的观察结果存储在 R 中的另一个数据框中
- groovy - 如何使用katalon studio处理Microsoft Edge 44.18362.449.0 [Windows 10]中弹出的Windows安全?
- nginx - Nginx 反向代理 glassfish 无法正确提供资源
- javascript - 在 JavaScript 中存储的全局范围内创建的常量在哪里?
- c - 有没有办法在 Microsoft Visual Studio 中启用对 C99 可变长度数组的支持。如果否,最好的选择是什么?
- ios - 如何在Objective-C的NSDictionary中添加动态排序数据
- javascript - jquery .prop(checked,true) 值未反映在调用的方法中
- sql-server - 用零替换列中的字符串