JavaScript动态删除组件的逻辑问题

JavaScript logic problem with dynamically deleting component

我正在映射数组中的值以创建 < select> 下拉列表。我希望能够动态地创建和删除它们。我已经弄清楚了创建(使用映射),但我遇到了删除问题。我在数组中使用一个键来区分值,但我的问题是当我去删除一个特定的 < select> 时,只有最新创建的被删除。这是因为传递给 delete 方法的密钥是最新创建的密钥(第 2 行:let key = array.key;)。什么是变通解决方案,可以让我在保留第 2 行的同时将正确的密钥传递给删除方法。希望这是有道理的。谢谢

编辑:下面的解决方案只需确保更新您在状态中映射的组件,否则旧数组将用于映射

{this.state.AdditionQueryArray.map((array) => {
          let key = array.key;
          return (
            <div>
              <Select
                onChange={(e) => this.HandleChange(e, key)}
                options={this.state.OperatorOptions}
                placeholder="Select Operator"
                menuPortalTarget={document.body}
                menuPosition={"fixed"}
              />
              <button onClick={() => this.delete(key)}>Delete</button>
              <div> 
            )
      }


delete(key) {
    const state = this.state;
    for (var i = state.AdditionQueryArray.length - 1; i >= 0; --i) {
      if (state.AdditionQueryArray[i].key == key) {
        state.AdditionQueryArray.splice(i, 1);
      }
    }
    this.setState(state);
  }

最简单的方法可能是将自定义(数据)属性添加到 button 标记并将其设置为 key 并在 delete 函数中使用 event 对象读取该属性

检查:https://developer.mozilla.org/en-US/docs/Learn/HTML/Howto/Use_data_attributes

为什么不传递索引而不是键?

如果您正在使用索引,您可以使用过滤器将其排除。例如

{this.state.AdditionQueryArray.map((array, index) => {
          return (
            <div>
              <Select
                onChange={(e) => this.HandleChange(e, key)}
                options={this.state.OperatorOptions}
                placeholder="Select Operator"
                menuPortalTarget={document.body}
                menuPosition={"fixed"}
              />
              <button onClick={() => this.delete(index)}>Delete</button>
              <div> 
            )
      }


delete(index) {
let tempArray = [...this.state.AdditionQueryArray]
let filteredArray = tempArray.filter((item, arrayIndex) => arrayIndex !== index)
this.setState({
    AdditionQueryArray: filteredArray
})

当我想删除列表中的元素时,我通常会使用它。我还添加 [...array] 使其不直接编辑状态