从项目数组中删除项目不起作用

Removing item from an array of items does not work

我想从项目列表中删除一个项目,但它似乎不起作用。我有一个页面,我可以在其中动态添加条目,也可以单独删除项目。添加似乎工作正常。

沙盒:https://codesandbox.io/s/angry-heyrovsky-r7b4k

代码

import React from "react";
import ReactDOM from "react-dom";

class App extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      value: "",
      values: []
    };
  }

  onChange = event => {
    this.setState({ value: event.currentTarget.value });
  };

  onAdd = () => {
    this.setState({
      value: "",
      values: [...this.state.values, this.state.value]
    });
  };

  onRemove = index => {
    console.log(index);
    let { values } = this.state;
    let filteredIDs = values.splice(index, 1);
    this.setState({
      values: filteredIDs
    });
  };

  render() {
    let { values, value } = this.state;
    return (
      <>
        <input
          required
          placeholder="xyz@example.com"
          value={value}
          onChange={this.onChange}
        />
        <button onClick={this.onAdd}>Add</button>
        <div>
          <ul className="email-list-holder wd-minus-150">
            {values.map((value, index) => (
              <li key={index}>
                {value}
                <button
                  onClick={() => this.onRemove(index)}
                  style={{ cursor: "pointer" }}
                >
                  Remove
                </button>
              </li>
            ))}
          </ul>
        </div>
      </>
    );
  }
}

这是为您准备的工作演示
https://codesandbox.io/s/purple-snow-kkudc

您必须更改以下行。

let filteredIDs = values.splice(index, 1);

用它代替上面的一个。

let filteredIDs = values.filter((x, i)=> i!==index);

希望这对你有用。

let filteredIDs = values.splice(index, 1); returns 从 values

中删除后删除的项目

你会想要

onRemove = index => {
  let { values } = this.state;
  values.splice(index, 1);
  this.setState({
    values
  });

tested and works on your codesandbox :p

我认为您在删除项目时使用了错误的 javascript 方法。

Splice method changes the contents of an array by removing or replacing existing elements and/or adding new elements

Slice method returns a shallow copy of a portion of an array into a new array object selected from begin to end (end not included) where begin and end represent the index of items in that array. The original array will not be modified.

替换

 let filteredIDs = values.splice(index, 1);

 let filteredIDs = values.slice(index, 1);

您设置的是数组中删除的部分,而不是正确的部分。

    onRemove = index => {
      console.log(index);
      let { values } = this.state;
      values.splice(index, 1);
        this.setState({
          values
        });
  };

这应该有效。

您将删除的项目设置为新值。这将修复它。

onRemove = index => {
console.log(index);
let { values } = this.state;
let filteredIDs = values.splice(index, 1);
this.setState({
  values: values
});

};

splice returns 已删除的元素,您正在设置已删除的元素。你可以直接做:

values.splice(index, 1);
this.setState({
  values,
})

您也可以使用 uniqueId 来给每个新元素一个 uniqueId 这将有助于过滤逻辑。

以下是我构建状态和方法的方式:

this.state = {
  values: {
    todo1: {
      value: 'a'
    },
    todo2: {
      value: 'b'
    },
  }
}


// Addition

this.setState({
  values: {
    ...this.state.values,
    uniqueId: {
      value: 'New Value from input'
    }
  }
});


// Deletion

const stateValues = this.state.values;

delete stateValues[uniqueId];

this.setState({
  values: stateValues,
});