使用筛选方法从数组中删除项目

时间:2019-10-20 03:20:29

标签: javascript reactjs typescript function events

我是React的新手,我正在尝试构建一个非常基本的时间表工具,用户可以在其中将任务添加到应用程序中并保存。我正在使用React以及Typescript。

到目前为止,我的主要组件包括一个空数组的任务和表格。然后,在表主体内部,我已映射为拉动表行和包含标签的单独组件。

我正在尝试添加一个按钮,以使用数组上的filter方法删除任务以删除单个项目的索引,但是单击并没有任何反应,或者得到未定义的错误。有人可以帮忙吗?我正在使用删除按钮并使用下面的删除功能来实现此目的

主要组件

import * as React from 'react';
import { ITimesheetToolProps } from './ITimesheetToolProps';
import { escape } from '@microsoft/sp-lodash-subset';
import TableRow from './TableRow';
import styles from './TimesheetTool.module.scss';

export default class TimesheetTool extends React.Component<ITimesheetToolProps, any> {
  state = {
    tasks: []
  }

  addTask = (task) => {
    const tasks = [...this.state.tasks];
    this.setState({tasks: this.state.tasks.concat(task)});
  }

  handleDelete = (index) => {
    const tasks = this.state.tasks.filter(t => t.index !== index);
    this.setState({ tasks });
  }

  public render(): React.ReactElement<ITimesheetToolProps, any> {
    return (
      <div>
        <button onClick={(task) => this.addTask(task)}>Add Task</button>
        <table>
          <thead className={styles.tbody}>
            <tr>
              <th>Project</th>
              <th>Task</th>
              <th>Monday</th>
              <th>Tuesday</th>
              <th>Wednesday</th>
              <th>Thursday</th>
              <th>Friday</th>
              <th>Saaturday</th>
              <th>Sunday</th>
            </tr>
          </thead>
          <tbody className={styles.tbody}>
            {this.state.tasks.map((task, index) => <tr key={index}><TableRow /><td><button onClick={() => this.handleDelete(index)}>Delete</button></td></tr>)}
          </tbody>
        </table>
      </div>
    );
  }
}

2 个答案:

答案 0 :(得分:0)

在不知道数据形状的情况下很难提供帮助,但是我认为这正是您要寻找的,请帮助我知道这是否有帮助

const tasks = this.state.tasks.filter((_, i) => i !== index);

代码有效,为什么要删除我不知道的数组中的最后一个项目,您必须

//change <button onClick..../>
// to this.
<button onClick={handleDelete(index)}/>

//change handleDelete to this..
const handleDelete = (index) => () => this.setState({tasks: this.state.tasks.filter((_, i) => i !== index)

答案 1 :(得分:0)

使用接头。

 handleDelete = (index) => { 
    this.setState({ tasks: this.state.tasks.splice(index,1);
 });
  }