开发者问题收集

TypeError:无法读取未定义的属性(读取“country”)

2021-12-06
12222

我尝试从 API 获取数据并在我的应用中使用该数据。但问题是,当我尝试从刚从 API 获得的 JSON 中获取某个对象或数据时,我收到 TypeError:无法读取未定义的属性“country”。 该属性确实存在。 顺便说一句,我正在使用 React.js。 非常感谢您的帮助和指导。 这是代码:

App.js

{typeof weather != 'undefined' ? (
  <div>
    <div className="location-box">
      <div className="location">
        
        {weather.name},{weather.sys.country} 
      </div>
      <div className="date"> {dateBuilder(new Date())} </div>
    </div>

    <div className="weather-box">
      <div className="weather-temperature">15*C</div>
      <div className="weather">Sunny </div>
    </div>
  </div>
) : ("NULL")}

我们将从中获取数据的 API。

function App() {
  const [query, setQuery] = useState("");
  const [weather, setWeather] = useState({});

  const Search = (evt) => {
    if (evt.key === "Entre") {
      debugger;
      fetch(`${api.base}weather?q=${query}&units=metric&APPID${api.key}`)
        .then((res) => res.json())

        .then((result) => {
          setWeather(result);
          setQuery("");
          console.log(result);
        });
    }
  };
}
2个回答

如果您确定该属性确实存在,那么它一定是初始渲染。您使用 {} 初始化 useStaet ,但要防止 undefined 。 因此,将 useState({}) 更改为 useState()

const [weather, setWeather] = useState();

您还可以在读取 country 时添加空检查。

{weather.name}, {weather.sys?.country}
Ayman El Temsahi
2021-12-06

问题出在您的天气检查上: typeof weather != 'undefined' ,而您的天气初始值为 { 。为了解决这个问题,不要为天气设置初始值。像这样:

const [weather, setWeather] = useState();

因此,在第一次渲染中,天气值将为 undefined ,而在下一次渲染中,它包含您的 api 响应。

Saeed Shamloo
2021-12-06