Поле идентификатора объекта Javascript не передается обработчику событий

#javascript #html #reactjs #jsx

#javascript #HTML #reactjs #jsx

Вопрос:

У меня есть приложение react, содержащее два компонента, Counters и Counter, где объект состояния компонента Counters содержит массив объектов, каждый из которых представляет счетчик.

В фактическом коде jsx для компонента Counters элементы в массиве counters отображаются, каждый из которых содержит кнопку удаления, где каждый отдельный счетчик может быть удален.Прямо сейчас у меня есть функция со стрелкой для обработки удаления, которая установлена как свойство в отображаемых тегах счетчика. В компоненте счетчика происходит событие onCLick на кнопке удаления, которое принимает в качестве параметра идентификатор счетчика, на который был нажат.

По какой-то причине удаление не работает, и когда я регистрирую в консоли идентификатор счетчика, на который был нажат, печатается undefined. Что может быть причиной того, что свойство id не считывается из компонента Counter?

Соответствующий код приведен ниже:

Компонент счетчика:

 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>
    );
  }
}
  

Ответ №1:

Вам нужно передать prop 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}
/>
  

Ответ №2:

У вас опечатка.

Вы должны использовать this.props.key внутри метода delete в классе Component вместо this.props.id .