javascript - setState 未正确更新状态
问题描述
我正在编写一个将子品种添加到品种数组的函数,即每个品种都是一个具有称为品种的属性的对象,它也是一个对象数组。
初始品种状态是
const defaultInitVarieties = [];
const [varieties, setVarieties] = useState(defaultInitVarieties);
addInner 声明为:
const addInner = (newEntry, parentId) => {
console.log('running add inner');
//copy varieties
let copy = [...varieties];
// get parent via id
let parent = copy.find(each => each.id === parentId);
// get index of parent
const index = copy.findIndex(each => each.id === parentId);
//create new color variety
const newParent = {
...parent,
varieties: [
...parent.varieties,
{
index: parent.varieties.length < 1 ? 0 : parent.varieties.length,
edit: false,
...newEntry,
}
]
};
//mutate copy
console.log('copy before', copy)
copy[index] = newParent;
console.log('copy after', copy);
//update state
setVarieties(copy);
};
问题
请记住,品种在数组中有一个对象,console.log('copy after', copy); 的结果 是;
[{
id: "31943632-0f91-419c-b6ee-55a3d92fdd28"
imageUrl: "/static/media/choose-image.ba6e31d9.svg"
size: "24"
quantity: 1
price: "2000"
discountPrice: "2000"
color: "red"
varieties: [
{
index: 0
edit: false
id: "eb351fff-4216-4080-8cc2-31e677aa5b0e"
imageUrl: "/static/media/choose-image.ba6e31d9.svg"
size: "22"
quantity: 1
price: "2000"
discountPrice: "2000"
color: "red"
}
]
}]
这是我所期望的。
但是,当我使用它设置Variety 时,我得到的是
[{
id: "31943632-0f91-419c-b6ee-55a3d92fdd28"
imageUrl: "/static/media/choose-image.ba6e31d9.svg"
size: "24"
quantity: 1
price: "2000"
discountPrice: "2000"
color: "red"
varieties: []
},
{
id: "eb351fff-4216-4080-8cc2-31e677aa5b0e"
imageUrl: "/static/media/choose-image.ba6e31d9.svg"
size: "22"
quantity: 1
price: "2000"
discountPrice: "2000"
color: "red"
varieties: []
}]
即 newEntry 添加是作为另一个品种添加的,而不是作为一个子品种!
解决方案
尝试setVarieties(newParent);
代替setVarieties(copy);
. 如果您想在控制台中看到预期的变化,那么copy[index] = newParent;
您copy = newParent;
不需要更改setVarieties(copy);
语句。
推荐阅读
- android - 如何在android时间选择器中设置“秒”?
- .net - 带有“非字符”的 Lookbehind 忽略位置 0 的匹配
- animation - 赛普拉斯等待转换完成(等待正确的宽度)
- node.js - 来自 apollo-server-micro 的 req.cookies 返回空对象
- python - 根据列 ID 在循环中对数据框列求和
- python - 在 Python 中四舍五入到小数点后三位
- laravel - 如何将中间件部分分配给 Laravel 资源路由?
- python - 拆分字符串并在数据框中对其进行排序
- c - 为什么 do while 循环在这里不能正常工作?
- flutter - 圆形缺口颤振与所选项目的变化