单击事件后如何从 ReactJS 中的数组中删除对象

Posted

技术标签:

【中文标题】单击事件后如何从 ReactJS 中的数组中删除对象【英文标题】:How to remove object from Array in ReactJS after click event 【发布时间】:2021-01-05 16:07:56 【问题描述】:

我正在使用 React 构建小应用程序,单击图标后我无法从 Array 中删除和对象。

我有带有输入的表单,当用户填写此输入并单击一个按钮时,输入将进入一个数组。我有一个状态数组,默认是空数组。

const [attendees, setAttendees] = useState([]);

点击图标后,我有一个从数组中删除对象的功能

const deleteAttendee = (attendee) => 
    setAttendees(
      attendees: attendees.filter(
        (element) => element.firstName !== attendee.firstName
      ),
    );
  ;

但是当我单击图标时出现问题,我收到错误消息。那张地图不是函数。

我在另一个组件中 映射函数 用于从输入呈现每个用户

<div className="attendee-container">
      attendees.map((_attendee, index) => 
        return (
          <div key=index>
            <div onClick=() => deleteAttendee(_attendee)>trashAltIcon</div>
            <h3>
              index + 1. _attendee.firstName _attendee.lastName (
              _attendee.age)
            </h3>
          </div>
        );
      )
    </div>

提前感谢您的帮助。

【问题讨论】:

【参考方案1】:

使用 setState 时,您会像现在一样传入完整的状态对象。但是,当使用 useState 挂钩时,setState 函数只接受该值。

查看这些docs 以了解 setState 和使用 useState 挂钩更新状态之间的区别

setAttendees 接受一个数组,所以你的处理程序应该是

const deleteAttendee = (attendee) => 
   //Pass in filtered array as new state for attendees
   setAttendees( attendees.filter((element) => element.firstName !== attendee.firstName);
;

【讨论】:

【参考方案2】:

setAttendees 带有一个参数,可以让你拥有之前的状态。

这是我对你的 deleteAttendee 函数所做的

const deleteAttendee = (event) => 

   const attendeeId = event.target.dataset.id;

   setAttendees((previousState) => previousState.filter((attendee) => attendee.id !== attendeeId))

;

我正在使用以前的状态并更新它,而不是删除名字,而是删除匹配的 ID

这是 jsx 的样子

return (
<div className="App">
  attendees.map((_attendee, index) => 
    return (
      <div key=_attendee.id>
        <div data-id=_attendee.id onClick=(event) => deleteAttendee(event)>trash</div>
        <h3>
          index + 1. _attendee.firstName _attendee.lastName (
          _attendee.age)
        </h3>
      </div>
    );
  )
</div>

);

我正在使用 data-id 属性,因此每当用户单击垃圾桶图标时,我都可以将该事件传递给 deleteAttendee,从属性中获取值并在匹配时过滤掉数组。我之所以进行此更改,是因为我看到您正在根据姓名进行过滤,如果两个与会者的姓名相同怎么办?

参加者的初始状态

const [attendees, setAttendees] = useState([
   
     id: 'tskdh3-3dfdgg-23ds-23dfsdd-2332',
     firstName: 'bob',
     lastName: 'jeo',
     age: 73
  ,
  
     id: 't3-3dfdgg-23ds-23dfsdd-2332',
     firstName: 'bob',
     lastName: 'woah',
     age: 43
  ,
  
     id: 'bsd233-33dfg-3ds-2f3fsdd-2dfdf',
     firstName: 'bob',
     lastName: 'yum',
     age: 23
   
]);

对于要生成的随机 id,您可以使用一个名为 uuid 的 npm 包,它会生成唯一的 id。

【讨论】:

以上是关于单击事件后如何从 ReactJS 中的数组中删除对象的主要内容,如果未能解决你的问题,请参考以下文章

在reactjs中删除重复项后如何从状态值和setstate创建数组

reactjs - 状态更改后组件不呈现[重复]

如何在 ReactJS 中的事件上添加或删除类名?

如何从 Vue.js 中的数组中删除一个项目

如何在reactjs中单击删除表格行?

从面板中删除用户控件时捕获事件