我正在尝试使用 react 钩子更新对象数组中的数组属性,众所周知,当我们需要根据先前的状态更新状态时,我们使用函数 set"MypopertyName" 如下图:
我的代码:
const [MenuList, setMenuList] = useState([
{
id: 0,
title: "sushi",
desc: "finest fish and vegies",
price: "$22.99",
amount: 1,
},
{
id: 1,
title: "shneitzel",
desc: "a german specialty",
price: "$50.99",
amount: 1,
},
{
id: 2,
title: "pizza",
desc: "an italian specialty",
price: "$100.99",
amount: 1,
},
{
id: 3,
title: "pasta",
desc: "an italian specialty",
price: "$200.99",
amount: 1,
},
]);
我的问题是,我想根据用户的点击次数更改餐点数量,因此我尝试了以下方法:
const onClickHandler = (id) => {
for (const key in MenuList) {
if (MenuList.id === id) {
return (MenuList[key].amount = MenuList[key].amount + 1);
}
}
};
我知道 react 的反应系统仅在我调用 setMenuList()
时才有效,我试过了,但除了我想不可变地更新特定对象之外它不起作用,所以我需要使用如下函数语法:< /p>
setMenuList((prevMenuList)=>{
//my code
})
另外,我没有设法让它工作,对不起,我是使用基于类的组件很长时间的老大师之一,你知道 state={}
等等新的钩子概念对我来说是新的。
因此,我们将不胜感激,并提前感谢您。
答案 0 :(得分:2)
基于函数的setter的使用
setMenuList((prevMenuList)=>{
在当前在其范围内的 menuList
不是当前正在呈现的内容时可以调用该函数时很有用 - 例如,在 API 调用完成后调用该函数时。这与 React 不改变状态的需求完全不同,后者完全需要另一种方法。
映射状态数组,当ID匹配时,返回一个数量递增的新对象。
const onClickHandler = (id) => {
setMenuList(
menuList.map(
obj => obj.id !== id ? obj : ({
...obj,
amount: obj.amount + 1
})
)
);
};