React JS: Добавление товаров в корзину

Добавление корзины и функции добавления товара

В компоненте, отображающем товары (например, App), создадим массив orders для хранения товаров в корзине. Вне функции render создадим функцию addToCart, принимающую товар (item) в качестве аргумента. В конструкторе компонента вызовем this.addToCart = this.addToCart.bind(this);. Функция addToCart использует setState для добавления товара в orders:

addToCart(item) {
  this.setState({ orders: [...this.state.orders, item] });
}

Здесь используется spread syntax (…) для создания копии массива и добавления элемента.

Передача функции в дочерние компоненты

Функция addToCart передается как свойство (prop) onAddToCart в дочерний компонент, отображающий список товаров (например, Items):

<Items onAddToCart={this.addToCart} />

В Items это свойство используется:

const Items = (props) => { ... props.onAddToCart ... }

и передается в компонент Item, отображающий каждый товар:

<Item item={item} onAddToCart={props.onAddToCart} />

В Item при нажатии на кнопку «Добавить» вызывается onAddToCart с текущим товаром:

<button onClick={() => props.onAddToCart(props.item)}>+</button>

Отображение корзины

Массив orders передается в компонент корзины (например, Header):

<Header orders={this.state.orders} />

Компонент OrderItem отображает каждый товар в корзине, получая его как свойство.

const OrderItem = (props) => {
  return (
    <div className="item">
      {/* Отображение товара */}
    </div>
  );
};

Header перебирает orders и отображает каждый товар с помощью OrderItem:

const Header = (props) => {
    return (
      <div className="shop-cart">
        {props.orders.map((item) => (
          <OrderItem item={item} key={item.id} />
        ))}
      </div>
    );
};

Стили

В index.css:

.shop-cart {
  /* Стили для корзины */
}

.item {
  /* Стили для каждого товара */
}

.item img {
  /* Стили для изображения товара */
}

Обработка дубликатов и пустой корзины

Добавим проверку на дубликаты и отображение сообщения о пустой корзине:

addToCart(item) {
  const isInCart = this.state.orders.some((order) => order.id === item.id);
  if (!isInCart) {
    this.setState({ orders: [...this.state.orders, item] });
  }
}

render() {
  return (
    <div>
      {this.state.orders.length > 0 ? (
        <div> {/* Тут код отображения товаров */} </div>
      ) : (
        <div className="empty">
          <h2>Товаров нет</h2>
        </div>
      )}
    </div>
  );
}

Добавим стили для сообщения о пустой корзине.

Реализован функционал добавления товаров в корзину с обработкой дубликатов и отображением сообщения о пустой корзине. Товары добавляются корректно, дубликаты игнорируются, и при пустой корзине отображается соответствующее сообщение.

Что будем искать? Например,программа