我如何删除一个项目内嵌套的钩子数组?



我试图从嵌套数组内的状态中删除单个项目,但我真的很难理解如何。

我的数据看起来如下,我试图删除一个'变体'对象点击。

const MYDATA = {
id: '0001',
title: 'A good title',
items: [
{
itemid: 0,
title: 'Cheddar',
variants: [
{ id: '062518', grams: 200, price: 3.00},
{ id: '071928', grams: 400, price: 5.50},
]
},
{
itemid: 1,
title: 'Edam',
variants: [
{ id: '183038', grams: 220, price: 2.50},
{ id: '194846', grams: 460, price: 4.99},
]
},
{
itemid: 2,
title: 'Red Leicester',
variants: [
{ id: '293834', grams: 420, price: 4.25},
{ id: '293837', grams: 660, price: 5.99},
]
}
]
}

每个变体对应一个按钮,该按钮调用remove函数,该函数(应该)删除已删除的项并更新状态。然而,这并没有发生,我不确定我做错了什么。

const [myCheeses, setMyCheeses] = useState(MYDATA);
const removeMyCheese = (variantID, itemindx) => {
console.log(variantID);
setMyCheeses((prev) => {
const items = myCheeses.items[itemindx].variants.filter(
(variant) => variant.id !== variantID
);
console.log(items, itemindx);
return {
...myCheeses.items[itemindx].variants,
items
};
});
};

我所面临的问题的一个例子可以在这里看到https://codesandbox.io/s/funny-dan-c84cr?file=/src/App.js

任何帮助都是非常感激的。

问题是,setMyCheeses函数不返回以前的状态,包括您的更改(删除)

试试这些函数中的一个;

<1方式/strong>

const removeMyCheese = (variantID, itemindx) => {
setMyCheeses((prev) => {
const items = myCheeses.items[itemindx].variants.filter(
(variant) => variant.id !== variantID
);
const newState = prev;
newState.items[itemindx].variants = items;
return {...newState};
});
};

https://codesandbox.io/s/bold-worker-b12x1?file=/src/App.js

<第二方式/strong>

const removeMyCheese = (variantID, itemindx) => {
setMyCheeses((prev) => {
const items = myCheeses.items.map((item, index) => {
if (itemindx === index) {
return {
...item,
variants: item.variants.filter(
(variant) => variant.id !== variantID
)
};
} else {
return item;
}
});
return { ...prev, items: items };
});
};

https://codesandbox.io/s/sharp-forest-qhhwd

试试这个函数,它的工作为我:

const removeMyCheese = (variantID, itemindx) => {
//console.log(variantID);
const newMyCheeses = myCheeses;
const newItems = newMyCheeses.items.map((item) => {
return {
...item,
variants: item.variants.filter((variant) => variant.id !== variantID)
};
});
setMyCheeses({ ...newMyCheeses, items: newItems });
};

https://codesandbox.io/s/jolly-greider-fck6p?file=/src/App.js

或者,如果您不喜欢使用map函数,您可以这样做:

const removeMyCheese = (variantID, itemindx) => {
//console.log(variantID);
const newMyCheeses = myCheeses;
const newVariants = newMyCheeses.items[itemindx].variants.filter(
(variant) => variant.id !== variantID
);
newMyCheeses.items[itemindx].variants = newVariants;
setMyCheeses({ ...newMyCheeses });
};

最新更新