javascript - 使用 React 钩子将数组元素分配给状态的正确方法是什么?
问题描述
我正在制作基于 api 的简单天气应用程序
在功能组件的开头,我声明了这一点
const [pressure, setPressure] = useState("")
const [hourTemp, setHourTemp] = useState([])
然后我使用 fetch() 从 api 下载数据对象并将值分配给状态。压力(例如)是单个值,但在我的应用程序中,我需要每小时预测,所以我采用整个每小时数组并对其进行过滤(它有 48 小时,我只需要 10 小时)。
setPressure(data.current.pressure)
let newArray = data.hourly.filter(a => {
return data.hourly.indexOf(a) < 10
})
创建 newArray 后,我可以 console.log它并完全按照我想要的方式打印 10 个对象的数组。
但是当我将此数组分配给状态时
setHourTemp(newArray)
然后传递一个元素作为道具,它返回未定义
<WeatherBlock temp={hourTemp[0].temp}/> //TypeError: hourTemp[0] is undefined
解决方案
因为您使用fetch
的是异步函数,所以需要时间来加载数据。当你第一次调用 /renderhourTemp[0]
时,数据仍然是空的,它返回错误 undefined。所以你需要验证数据是否存在。有很多方法可以做到这一点:
- 使用三元表达式
<WeatherBlock temp={hourTemp[0] ? hourTemp[0].temp : 0}/>
- 使用条件渲染,在返回之前使用 if else
if(hourTemp[0]){
return <WeatherBlock temp={hourTemp[0].temp}/>
} else {
return <WeatherBlock temp={0}/>
}
推荐阅读
- c# - 如何使用 .NET SDK 使用 Lambda 目标创建 EventBridge 规则
- react-native - 如何使用 Redux(React Native)处理多个请求 - 不覆盖自身?
- javascript - 我们如何在 firestore (RNFirestore) 中的一次调用中创建一个文档,给它一些字段,并给它一个子集合?
- python - 如何在python中的列表列表中找到所有可能的序列?
- c# - 如何在 Microsoft.ML.onnxruntime 的 C# 编码中访问 DisposableList?
- arrays - 超过 400,000 行的数组未正确粘贴到 Excel 范围内?
- reactjs - 如何将 promise 转换为它所持有的数组?
- javascript - 为什么这个 NodeJS 掷骰子代码这么慢?
- haskell - Haskell - 无法运行简单的程序
- java - Spark - Java - 无法获取数组的 JDBC 类型
插入 Oracle Array 列类型时