使用挂钩(useState)从数组中删除对象

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)


Mah*_*dra 8

我刚刚遇到了同样的问题,并使用此问题中的答案进行了修复。我把我的答案放在这里是因为我必须使用多个答案才能到达那里。

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)

  • @IanSmith 有什么建议吗? (2认同)

Wil*_*ins 6

您可以使用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)