Проблема связана с вашим addDevice
методом, а именно с тем, как вы создаете newData
.Вы устанавливаете newData
в [this.state.devices.title]
, что оценивается в [undefined]
, поскольку this.state.devices
является массивом и, следовательно, не имеет атрибута с именем title
.Таким образом, обновленное значение state.bag
будет [undefined, data]
и будет отображаться только как data
, которое является названием самого последнего нажатого устройства.
Я думаю, что вы хотите сделать здесь - добавитьназвание кликаемого устройства в массиве state.bag
.Вы можете сделать это с помощью метода addDevice
, подобного следующему:
addDevice = (e, data) => {
console.log(data);
const newBag = this.state.bag.concat(data);
this.setState({
bag: newBag
});
};
Хотя лучший способ обновления state.bag
будет использовать функциональную форму setState
и оператор распространения (...
) более распространено для такого рода вещей, чем использование concat
.Также было бы полезно переименовать data
во что-то более понятное (например, deviceTitle
).Пример:
addDevice = (e, deviceTitle) => {
this.setState(prevState => ({
bag: [...prevState.bag, deviceTitle],
});
}
Редактировать:
Если вы хотите добавить функциональность для удаления устройств из state.bag
, вы можете создать метод с именем removeDevice
и добавитькнопка рядом с каждым элементом сумки при рендеринге.
Например:
removeDevice = (e, deviceTitle) => {
this.setState(prevState => ({
bag: prevState.bag.filter(d => d !== deviceTitle),
});
}
Тогда в вашем методе рендеринга вы получите что-то вроде этого:
<ul>
{this.state.bag.map(deviceTitle => (
<li>
<span>{ deviceTitle }</span>
<button onClick={ e => this.removeDevice(e, deviceTitle) }>remove</button>
</li>
))}
</ul>