#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
.