未捕获的类型错误:无法读取未定义的属性(读取‘名称’)-ReactJS
2022-07-06
1467
import Info from "./components/Info";
import Search from "./components/Search";
import axios from "axios";
import { useEffect, useState } from "react";
const App = () => {
const API_KEY = `<REDACTED>`
const baseURL = `http://api.weatherapi.com/v1/current.json?key=${API_KEY}&q=`
const [weatherData, setWeatherData] = useState({})
const [search, setSearch] = useState('London')
const [error, setError] = useState('')
useEffect(() => {
axios.get(`${baseURL + search}`)
.then(resp => {
setWeatherData(resp.data)
})
.catch(error => setError(error.message))
}, [search])
console.log(weatherData.location.name);
return (
<div className="App">
<h1 style={{ textAlign: 'center', marginBottom: '2rem' }}>{error}</h1>
<Search setSearch={setSearch} />
<div className="container">
<Info weatherData={weatherData} />
</div>
</div>
);
}
export default App;
我正在尝试用 React 创建一个天气应用。我使用的是代码中可以看到的天气 API(也许您也应该看一下 API 结构)。 当我在控制台中记录 weatherData.location 时,我得到了正常的天气数据。但是当我尝试 weatherData.location.name 时,我得到了错误: Uncaught TypeError:无法读取未定义的属性(读取“name”) 。 我两周前才开始学习 React,所以我还是个初学者……谢谢。
2个回答
当 API 尚未发送响应且天气数据仍为空时,就会发生这种情况。
我建议添加
[loading,setLoading]
状态并将其默认设置为 true。然后在
.then(resp =>
函数中将其设置为 false。创建一个 if 语句来检查 loading 是否为 false,如果是,则打印/呈现 weatherData 的内容。
Westsi
2022-07-06
您需要在 console.log 中添加三元运算符
如 console.log(weatherData? location ? .name ) 或者您可以尝试 console.log(weatherData && weatherData.location && weatherDataname.location.name)
发生这种情况是因为在初始状态下它无法读取 name 的值,因为它可能是一个空字符串。
尝试这种方法。
Akshay Padmanabhan
2022-07-06