Javascript对象ID字段未传递给事件处理程序

时间:2019-03-14 04:34:15

标签: javascript html reactjs jsx

我有一个React应用,其中包含两个组件Counters和Counter,其中Counters组件的状态对象包含一个对象数组,每个对象代表一个Counter。

在Counters组件的实际jsx代码中,呈现了counters数组中的项目,每个项目都包含一个可以删除每个单独的计数器的删除按钮。现在,我有一个箭头函数来处理删除操作,即在要呈现的Counter标签中设置为属性。在Counter组件内,删除按钮中存在一个onCLick事件,该事件将被单击的Counter的ID作为参数。

由于某种原因,删除无法正常进行,当我在控制台日志中单击时,计数器的ID会被打印出来,即未定义。 是什么原因导致无法从Counter组件读取id属性?

相关代码如下:

计数器组件:

class Counter extends Component {
  state = {
    value: this.props.value
  };


  render() {
    console.log(this.props);
    return (
      <div>
        {this.props.children}
        <span className={this.getBadgeClasses()}>{this.formatCount()}</span>
        <button
          onClick={() => this.handleIncrement({ id: 1 })}
          className="btn btn-sercondary btn-sm"
        >
          Increment
        </button>
        <button
          onClick={() => this.props.onDelete(this.props.id)}
          className="btn btn-danger btn-sm m-2"
        >
          Delete
        </button>
      </div>
    );
  }

计数器组件:

import Counter from "./counter";

class Counters extends Component {
  state = {
    counters: [
      { id: 1, value: 4 },
      { id: 2, value: 0 },
      { id: 3, value: 0 },
      { id: 4, value: 0 }
    ]
  };

  handleDelete = counterId => {
    console.log("Event Handler Called", counterId);
    const counters = this.state.counters.filter(c => c.id !== counterId);
    this.setState({ counters });
  };
  render() {
    return (
      <div>
        {this.state.counters.map(counter => (
          <Counter
            key={counter.id}
            onDelete={this.handleDelete}
            value={counter.value}
          />
        ))}
      </div>
    );
  }
}

2 个答案:

答案 0 :(得分:1)

您需要在组件id的呈现函数中将属性Couter传递给Couters,因为按钮需要<button onClick={() => this.props.onDelete(this.props.id)}

在这里看到

<Counter
   id={counter.id}
   key={counter.id}
   onDelete={this.handleDelete}
   value={counter.value}
/>

或者,您可以这样做

<Counter
   key={counter.id}
   onDelete={() => this.handleDelete(counter.id)}
   value={counter.value}
/>

答案 1 :(得分:0)

您有错字。

您应该在Component类的delete方法内使用this.props.key而不是this.props.id