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

新手上路,请多包涵

我有一个对象数组。我需要添加一个函数来从我的数组中删除一个对象,而不使用“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 许可协议

阅读 1.1k
2 个回答

首先, span 元素需要有一个 name 属性,否则在 e.target 中将找不到名称。话虽如此, e.target.name 保留给表单元素(输入、选择等)。因此,要真正利用 name 属性,您必须使用 e.target.getAttribute("name")

此外,因为您有一个对象数组,所以使用 list.indexOf(e.target.name) 不会有效,因为当您迭代对象时,它正在寻找 string 。这就像说在 [{}, {}, {}] 中找到“狗”

最后, 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);

原文由 Chris Ngo 发布,翻译遵循 CC BY-SA 4.0 许可协议

您可以使用 Array.filter 在一行中执行此操作:

 const handleRemoveItem = name => {
    updateList(list.filter(item => item.name !== name))
}

Eta:您还需要在 onClick 处理程序中传递您的项目名称:

 {list.map(item => {
    return (
        <>
        <span onClick={() =>handleRemoveItem(item.name)}>x </span>
        <span>{item.name}</span>
        </>
    )}

原文由 Will Jenkins 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进