@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 полные данные товаров?
  • Вопрос задан
  • 847 просмотров
Решения вопроса 1
0xD34F
@0xD34F Куратор тега Vue.js
получать данные для корзины - в actions, через Promise.all по id вытаскивая данные для каждого товара?

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

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

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

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

Похожие вопросы