使用 onClick 从列表中删除单个项目

Remove a single item from the list with onClick

我有以下包含多个对象数组的对象。我想知道如何使用 onClick 从列表中删除单个项目。

我知道我可以尝试拼接,但我不知道如何在这个对象形状内进行拼接

const [filters, setFilters] = useState(initialData || [])

我这样试过

HandleClick

const handleClick = () => {
    const newState = filters
    const index = newState[key].findIndex((a) => a.id === id)

    if (index === -1) return
    newState[key].splice(index, 1)

    setFilters(newState)
  }

数据对象

{
  "services": [
    {
      "id": "1b975589-7111-46a4-b433-d0e3c0d7c08c",
      "name": "Account"
    },
    {
      "id": "91d4637e-a17f-4b31-8675-c041fe06e2ad",
      "name": "Income"
    }
  ],
  "accountTypes": [
    {
      "id": "1f34205b-2e5a-430e-982c-5673cbdb3a68",
      "name": "Investment"
    }
  ],
  "channels": [
    {
      "id": "875f8350-073e-4a20-be20-38482a86892b",
      "name": "Chat"
    }
  ]
}

点击渲染

<div onClick={handleClick}>
   <Icon fileName="smallClose" />
</div>

打印组件时,确保将它们添加到数组的 ID


<div id={idOfItem} onClick={handleClick}>
   <Icon fileName="smallClose" />
</div>
…….


function handleClick (e) {

e.preventDefault();
const {id} = e.target;

const list = yourItems.filter(item=> item.id!== id);

setItems(list);

}

可能是因为您没有在任何地方声明“id”变量?如果它在地图循环中,您可以在 div 事件上发送元素 ID。我认为这可以解决您的问题。

<div onClick={() => handleClick(id)}>

然后将其作为参数导入您的函数:

 const handleClick = (id) => {
    const newState = filters
    const index = newState[key].findIndex((a) => a.id === id)

    if (index === -1) return
    newState[key].splice(index, 1)

    setFilters(newState)
  }

此外,当您声明 newState 值时,请确保在声明中使用扩展运算符,在您当前的行为中,您正在改变您的状态,并且在反应中不推荐这样做:

const newState = [...filters];