即使使用状态,React api 请求也给出未定义的结果
2021-04-20
1092
我正在使用 react 和 react-router-dom 制作一个天气应用 现在当我发出 api 请求并将其设置为状态时 稍后我尝试访问该对象的特定值时,我得到了未定义的值。我知道我写的路径是正确的,但我一直得到未定义的值 这是我得到的错误:TypeError:无法读取未定义的属性“IconPhrase”
这是代码:
import "./App.css";
import React, { useState, useEffect } from "react";
const URL =
"http://dataservice.accuweather.com/forecasts/v1/daily/5day/1761?apikey=tCl4ePcWJ4pcpzDCWO51JkxmOLgPjZOM&language=nl-NL&details=true&metric=true";
function Weather() {
const [weather, setWeather] = useState([]);
useEffect(() => {
fetch(URL)
.then((response) => response.json())
.then((data) => data.DailyForecasts)
.then((days) => setWeather(days[0]));
}, []);
console.log(weather);
return (
<div className="App">
<header className="App-header">
<div className="ImageDisplay">
<div
className="InnerDisplay"
style={{ backgroundImage: `url("../src/heavyrain.svg")` }}
>
<span className="Degrees">{`${weather.Day.IconPhrase}`}</span>
</div>
</div>
</header>
</div>
);
}
export default Weather;
3个回答
因为您使用的
weather
的初始值为
[]
,而第一次渲染时,weather 仍为
[]
。它只会在
useEffect
中的 API 调用成功时更新
您需要修复 2 个地方:
-
[weather, setWeather] = useState({});
它可以帮助您的代码简洁。 -
${weather?.Day?.IconPhrase
。它可以帮助您解决问题
Viet
2021-04-20
之所以发生,是因为您在
useffect
中提出了请求。因此,由于
const [天气,setWeather] = usestate([]);
,如果您在链条之前检查天气罚款。
403422196
ilkerkaran
2021-04-20
您需要做的是在渲染之前检查
weather.Day
。您可以为此使用条件渲染。
{weather.Day && <span className="Degrees">{`${weather.Day.IconPhrase}`}</span>}
此外,我的演示需要
https
获取 URL(以防万一)
这是沙盒工作,请检查其中的控制台。
https://codesandbox.io/s/keen-wildflower-s2j4u?file=/src/App.js:769-848
Tushar Gupta
2021-04-20