@bormor

Vuex для каталога с корзиной — как лучше реализовать такое решение?

За основу взял пример каталога из официальной документации (link

У нас есть хранилище с такой структурой (условно)
products: [{}, {}, {}, ...]  // массив объектов с данными товаров
cartItems: [{id:1, quantity: 1}, ...]  // объесты со ссылками на id товара в products и количеством


Данные для корзины мы генерируем в getters на основе массива products
getters: 
  cartProducts: (state, getters, rootState) => {
    return state.items.map(({ id, quantity }) => {
      const product = rootState.products.all.find(product => product.id === id)
      return {
        title: product.title,
        price: product.price,
        quantity
      }
    })
  }
}


Вопрос - как получать данные для корзины товаров, если в state.products у нас хроняться не все товары, а только их часть (загруженная с сервера для текущей страницы пагинации)?

Первые идеи на эту тему:
получать данные для корзины - в actions, через Promise.all по id вытаскивая данные для каждого товара?
но как тогда лучше эти данные хранить и обновлять(например удалив товар или поменяв их количество)?

или лучше уйти от DRY и хранить в cartItems полные данные товаров?
  • Вопрос задан
  • 831 просмотр
Решения вопроса 1
0xD34F
@0xD34F Куратор тега Vue.js
получать данные для корзины - в actions, через Promise.all по id вытаскивая данные для каждого товара?

В смысле - хранить в cartItems только id (ну ещё количество и цену), а при каждом заходе пользователя в корзину подтягивать остальные данные (название/производитель/гарантия/...)? Во-первых, что ещё за Promise.all - собираетесь ради каждого товара выполнять отдельный запрос? Так дела не делаются - передавать на сервер следует массив id, запрос должен быть один. Во-вторых - получится, что у вас есть в хранилище массив id, а в компоненте корзины локально лежат полные данные товаров. На мой взгляд - как-то сложновато, при манипуляции данными cartItems из компонента корзины последний придётся вручную поддерживать в актуальном состоянии - watch на cartItems, отфильтровывание из локального массива удалённых элементов, копирование количества существующих.

Короче, я при добавлении товара в корзину просто полностью бы копировал в cartItems данные из products.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Если в products нет нужных товаров - подгрузите их.

У вас есть действие которое грузит товары на страницу.
Сделайте действие которое будет подгружать товары по массиву id.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы