开发者问题收集

即使使用状态,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