我有一个对象数组。我需要添加一个函数来从我的数组中删除一个对象,而不使用“this”关键字。
我尝试使用 updateList(list.slice(list.indexOf(e.target.name, 1)))
。这会删除数组中除最后一项之外的所有内容,我不确定为什么。
const defaultList = [
{ name: "ItemOne" },
{ name: "ItemTwo" },
{ name: "ItemThree" }]
const [list, updateList] = useState(defaultList);
const handleRemoveItem = e => {
updateList(list.slice(list.indexOf(e.target.name, 1)))
}
return (
{list.map(item => {
return (
<>
<span onClick={handleRemoveItem}>x </span>
<span>{item.name}</span>
</>
)}
}
)
预期:单击的项目将从列表中删除。
ACTUAL:整个列表被删除,减去数组中的最后一项。
提前感谢您的任何意见!
原文由 collinswade408 发布,翻译遵循 CC BY-SA 4.0 许可协议
首先,
span
元素需要有一个name
属性,否则在e.target
中将找不到名称。话虽如此,e.target.name
保留给表单元素(输入、选择等)。因此,要真正利用 name 属性,您必须使用e.target.getAttribute("name")
此外,因为您有一个对象数组,所以使用
list.indexOf(e.target.name)
不会有效,因为当您迭代对象时,它正在寻找string
。这就像说在[{}, {}, {}]
中找到“狗”最后,
array.slice()
返回一个新数组 ,从您传递给它的索引处的项目开始。因此,如果您单击最后一项,则只会返回最后一项。尝试这样的事情,而不是使用
.filter()
: codeandbox