3 回答

TA貢獻1878條經驗 獲得超4個贊
是的,這是因為異步行為。該weatherData
對象將始終存在(最初作為 {},然后在請求完成后使用獲取的數據)。
在初始渲染中,weatherData.name
will equal{}.name
將返回 undefined,但不會導致錯誤。
但是,當您運行時,weatherData.main.temp
它將 equal {}.main.temp
,這意味著您實際上正在調用undefined.temp
這將引發錯誤。僅當main
prop 未定義時才會拋出此錯誤,這意味著一旦實際獲取數據,它就應該正常工作。
您可以通過幾種不同的方法來解決這個問題,我推薦以下兩種方法之一:
如果提取尚未完成,則呈現“正在加載數據...”等的條件渲染。
條件訪問器。嘗試訪問
weatherData.main?.temp
而不是weatherData.main.temp
. 不確定它是否能在 JSX 內部工作,但假設您使用的是最新版本的 babel ,它可以正確轉換條件分支,那么它應該可以在外部工作。您還可以創建一個
weatherData
定義了預期接口的初始對象,但所有值都設置為undefined
.
換句話說,
const initialWeatherData = {
name: undefined,
main: {
temp: undefined,
}
}
// etc, leaving out most of the object as I'm sure you get what I'm trying to do
// just make sure you define the entire interface
const [weatherData, setWeatherData] = useState(initalWeatherData);

TA貢獻1804條經驗 獲得超7個贊
如果你設置如下
setWeatherData({
data
})
您的天氣數據將是
{
data: {
main: {...},
name: '...'
sys: {...}
}
}
要訪問 main,您應該使用
weatherData.data.main

TA貢獻1887條經驗 獲得超5個贊
您可以通過此代碼和 API 圖像來理解這個想法。希望對您有幫助
import React from 'react'
class GetData extends React.Component {
state = {
data: []
};
async componentDidMount() {
try {
const url = "http://localhost:8000/blogList";
const response = await fetch(url);
const data = await response.json();
console.log(data);
this.setState({ data: data.result });
} catch (err) {
console.log(err);
}
}
render() {
const { data } = this.state
return (
<div>{
<ul>
{data.map((item, i) => {
return <li key={item.id}>{item.title}</li>
})}
</ul>
}
</div>
);
}
}
export default GetData
添加回答
舉報