[英]how to toggle an array of objects using react useState hook
在我的反应应用程序中,我有多个类别,在每个类别下我有多个选项。 我正在尝试编写一个 function 来处理切换选择。 例如:
const initialState=[{id: "fruit", items:["apple", "banana"]}, {id: "veggie", items:["cucumber"]}]
const [selectedItems, setSelectedItems] =useState(initialState)
如果我点击香蕉,结果应该是:
[{id: "fruit", items:["apple"]}, {id: "veggie", items:["cucumber"]}]
如果我单击另一个水果,例如桃子,结果应该是:
[{id: "fruit", items:["apple", "banana", "peach"]}, {id: "veggie", items:["cucumber"]}]
如果我点击鸡肉,结果应该是:
[{id: "fruit", items:["apple", "banana"]}, {id: "veggie", items:["cucumber"]}, {id: "meat", items: ["chicken"]}]
我有一个这样的切换处理程序:
function toggle(changed: string, id: string) {
if (selectedItems.find((cat) => cat.id === id)) {
//toggle
} else {
setSelectedItems([
...selectedItems,
{ id: id, items: [changed] },
])
}
}
我在切换部分努力处理现有对象。 有什么帮助吗? 谢谢。
function toggle(changed: string, id: string) {
if (selectedItems.find((cat) => cat.id === id)) {
const obj = selectedItems.find(x => x.id === id);
const itemsToProcess = obj.items
// exist, to remove
if(itemsToProcess.find(x => x === changed)){
setSelectedItems([
// things we don't touch
...selectedItems.filter(x => x.id !== id),
// filtered array
{id, items: [...itemsToProcess.filter(i => i !== changed)]}
])
}
// to add
else{
setSelectedItems([
...selectedItems.filter(x => x.id !== id),
{id, items: [...itemsToProcess, changed]}
])
}
} else {
setSelectedItems([
...selectedItems,
{ id: id, items: [changed] },
])
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.