javascript - 无法通过函数调用使用 useState 挂钩设置状态
问题描述
我已经像这样设置了我的初始状态对象:
const [Item,SetItem] = useState(
{
description: "Chicken",
foodNutrients:[
{nutrientName: "Protein", nutrientNumber: "203", value: 10},
{nutrientName: "Fat", nutrientNumber: "204", value: 15},
{nutrientName: "Carbs", nutrientNumber: "205", value: 20}
]
}
)
我想通过遍历 foodNutrient 数组并将按钮单击时的值加倍来修改我现有的对象,然后将更新的对象存储在 useState 挂钩中。
const Double = e => {
SetItem(Item.foodNutrients.forEach(foodNutrient => foodNutrient.value *= 2))
console.log(Item)
}
它在我第一次尝试单击时将正确的结果记录到控制台<button onClick={Double}>Set state</button>
,但第二次它抛出Cannot read property 'foodNutrients' of undefined
并且我无法渲染任何东西。
解决方案
事件处理程序中的逻辑将初始对象替换为undefined
因为默认Array.prototype.forEach
返回undefined
。
你需要做的是:
map
到具有新值的数组- 保留先前的状态并将状态中的数组值设置为新的映射数组
const Double = (e) => {
const foodNutrientsNew = Item.foodNutrients.map((foodNutrient) => ({
...foodNutrient,
value: foodNutrient.value * 2,
}));
SetItem((prev) => ({ ...prev, foodNutrients: foodNutrientsNew }));
};
更新
我还建议重构您的代码并将其拆分为更多组件。只需在此处关注官方文档文章
推荐阅读
- drop-down-menu - 为什么下拉菜单有这个包装问题?
- python - 在python中粘贴代码是一个长期存在的问题,有简单的解决方案吗?(制表符与空格)
- neo4j - 如何连接到 Neo4j?
- c# - 具有成对限制的列表的 FsCheck 生成器 (C#)
- python - 使用 oauth2 为 Google Play Developer API 授权服务帐户
- android - MPChart BarChart X 轴标签问题
- python - Python 拼字游戏。如何以不正确的响应循环?
- firebase - 如何将域从 www.test.tk 重定向到 https://test.tk
- c# - 同时发送多封电子邮件
- file - 如何以递归方式打开在另一个文件中找到名称的文件