Вы используете array
элементов, но ссылаетесь на единственное общее значение в обработчиках. Де-факто вы используете несколько общих значений: showButton, hideButton, aValue
), 2/3 не нужно;)
Первый - aValue
для каждого элемента должен храниться в структуре - array
или object
. Это может быть order = {}
-объект с id
-ключаемыми свойствами со значениями в виде значений, подобных этому:
order = {
'masala_id': 1,
'kebab_id' : 2
}
Обработчик события (для 'add') должен проверить, существует ли id
для выбранного товара, уже существующего в объекте заказа (как имя свойства) и обновить сумму (+/-) или создать новый со значением 1
(и удалить свойство при уменьшении суммы = 0).
На практике order
также должен содержать price
- он похож на дубликаты данных, но будет намного легче посчитать общую стоимость заказа.
order = {
'masala_id': {
'amount': 1,
'price': 20,
},
'kebab_id' : {
'amount': 2,
'price': 180,
}
}
Элемент не обязательно должен быть компонентом, но его гораздо проще поддерживать, сохранять для чтения и т. Д.
Таким образом, мы можем просто передать уже заказанную сумму и условно отобразить кнопки:
<Product id={d.id}
name={d.item_name}
price={d.price}
amount={order[d.id] ? order[d.id].amount : 0 }
amountHandler={this.changeAmountHandler}
/>
Продукт должен быть немного улучшен и упрощен (например, key
необходимо сверху div
):
class Product extends React.Component {
render () {
const (id, name, price, amount, amountHandler} = this.props;
const showIncrease = !!amount; // boolean, it also means "don't show add button"
return (
<div key={id} >
<div className="content">
<div className="items">{name}</div>
<div className="prices">{price} Rs.</div>
{showIncrease ?
<div>
<button
className="grp-btn-minus"
onClick={(e) => { amountHandler(e, id, -1) }}
>-</button>
<input className="grp-btn-text" type="text"
value={amount}
readOnly/>
<button
className="grp-btn-plus"
onClick={(e) => { amountHandler(e, id, 1) }}
>+</button>
</div> :
<button
onClick={(e) => { amountHandler(e, id, 1) }}
className="add-menu-btn"
>add</button>
}
</div>
</div>
)}}
Таким образом, вы можете обрабатывать все события в одном обработчике, сохранять все состояние порядка в главном компоненте ... в случае проблем с производительностью просто используйте PureComponent
.