col*_*408 4 typescript reactjs react-hooks
我有一个对象数组。我需要添加一个函数来从我的数组中删除一个对象,而无需使用“ 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>
</>
)}
}
)
Run Code Online (Sandbox Code Playgroud)
预期:单击的项目将从列表中删除。
实际:整个列表将被删除,减去数组中的最后一项。
预先感谢您的任何投入!
Chr*_*Ngo 60
首先,span具有点击事件的元素需要有一个name属性,否则在e.target. 话虽如此,e.target.name保留用于表单元素(输入、选择等)。所以要真正利用 name 属性,你必须使用e.target.getAttribute("name")
此外,因为您有一个对象数组,所以使用它不会有效,list.indexOf(e.target.name)因为它string在您迭代对象时正在寻找 a 。这就像说在里面找到“狗”[{}, {}, {}]
最后,array.slice()返回一个新数组,从您传递给它的索引处的项目开始。因此,如果您单击最后一项,则只会返回最后一项。
尝试这样的事情而不是使用.filter():codeandbox
import React, { useState } from "react";
import ReactDOM from "react-dom";
import "./styles.css";
const App = () => {
const defaultList = [
{ name: "ItemOne" },
{ name: "ItemTwo" },
{ name: "ItemThree" }
];
const [list, updateList] = useState(defaultList);
const handleRemoveItem = (e) => {
const name = e.target.getAttribute("name")
updateList(list.filter(item => item.name !== name));
};
return (
<div>
{list.map(item => {
return (
<>
<span name={item.name} onClick={handleRemoveItem}>
x
</span>
<span>{item.name}</span>
</>
);
})}
</div>
);
};
const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);
Run Code Online (Sandbox Code Playgroud)
我刚刚遇到了同样的问题,并使用此问题中的答案进行了修复。我把我的答案放在这里是因为我必须使用多个答案才能到达那里。
const defaultList = [
{ name: "ItemOne" },
{ name: "ItemTwo" },
{ name: "ItemThree" }
]
const [list, updateList] = useState(defaultList);
const handleRemoveItem = idx => {
// assigning the list to temp variable
const temp = [...list];
// removing the element using splice
temp.splice(idx, 1);
// updating the list
updateList(temp);
}
return (
{list.map((item, idx} => {
return (
<div key={idx}>
<button onClick={() =>handleRemoveItem(idx)}>x </button>
<span>{item.name}</span>
</div>
)}
}
)
Run Code Online (Sandbox Code Playgroud)
您可以使用Array.filter做到这一点:
const handleRemoveItem = name => {
updateList(list.filter(item => item.name !== name))
}
Run Code Online (Sandbox Code Playgroud)
预计:您还需要在onClick处理程序中传递商品的名称:
{list.map(item => {
return (
<>
<span onClick={() =>handleRemoveItem(item.name)}>x </span>
<span>{item.name}</span>
</>
)}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2236 次 |
| 最近记录: |