我是Reactjs的新手,我正在学习使用setState方法更改状态属性。我对在 reactjs 中更改状态几乎没有问题。
我正在使用开放的天气API构建一个天气网络,用于教育目的。我将一些属性保存在状态中,以便可以将它们作为 props 传递给其他组件。状态如下:
export default class App extends Component {
state ={
error: null,
temperature: null,
WeatherName: null,
isLoaded: false,
Weather5days: [{}]
}
我有一些正常的属性(例如温度,已加载(以及称为Weather5days的对象数组。在这里,我将保存每 5 天的天气数据;每天的数据将进入每个数组,总长度为 5。我知道javascript允许声明长度未知的数组和对象(这是你声明它的方式吗?(,所以我已经声明了它。因此,Weather5days中的数据将如下所示:
state = {
...
Weather5days = [{date: "8.21", temperature: "20"},
{date: "8.22", temperature: "25"},
{date: "8.23", temperature: "24"},
...so on
]
现在我想添加/更改每个天气5天数组的属性,例如天气5天[0].温度= '25'等...我从天气 API 获取这些数据作为 json(也在数组中(,并将解析的数据分配给创建的 Weather5days 数组对象。
我做了一些谷歌搜索,发现我不能直接改变状态,所以我在获取后做了以下操作:
.then(json =>{
this.setState(prevState => {
const newItems = [...prevState.Weather5days];
for(var i = 0; i < json.Forecasts.length; i++){
newItems[i].date = json.Forecasts[i].Date;
}
return {Weather5days: newItems};
}
我在这里使用 for 循环将 API 中所有解析数据的日期保存到 Weather5days 对象的每个数组中。但是,这是我得到的错误:
类型错误:未定义不是对象(评估 'newItems[i].date = 杰森。预测[i].日期'(
我不太清楚为什么。也许我宣布了 Weather5days 对象是错误的,还是应该首先声明它们的长度?谢谢!
更新我已经摆弄了代码,在状态下,我试图声明 Weather5days 数组如下,它起作用了:
state = {
error: null,
temperature: null,
WeatherName: null,
isLoaded: false,
Weather5days: [{date:null},{date:null},{date:null},{date:null},{date:null}]
};
所以我所做的只是首先创建 5 个数组对象。我不知道为什么。然而,这并不是真正的解决方案,因为在某些情况下,我首先不知道数组的长度。有什么想法吗?
您的状态(在编辑之前(使用Weather5days: [{}]
初始化,一个包含一个元素的数组。然后,在 newItems 中复制数组,并使用 for 循环中越界的newItems[i].date
索引读取大于 0 的索引。在你的用例中使用 for 循环是不安全的,你应该使用 Array 的 map 方法来返回你的新项目:json.Forecasts.map((forecast, index) => ({} /* return your newItem */))
使用:从"不可变性助手"导入更新;
this.setState(prevState => update(prevState, {
Weather5days: { $set: json.Forecasts}
})