@Hfnas

Почему не работает bundle.products?

Имеется интерфейс калькулятора.

FormProductList.vue
<template>
       <div v-if="totalFormProducts" >
            yes
        </div>
    <fieldset class="products">
            <FormProductItem
                v-for="item in bundle.products"
                :key="item.id"
                :form-product="item"/>
    </fieldset>
</template>

<script>
    import FormProductItem from "./FormProductItem.vue";
    import {mapActions, mapMutations, mapState} from "vuex";
    export default {
      name: "FormProductList",
      components: {FormProductItem},
      computed: {
        ...mapState("calc", ["bundle", "menu"])
      },
      methods:{
        ...mapActions("calc", ["removeFormProduct"]),
      }
    }
</script>


FormProductItem.vue
<template>
    <div class="row">    
           <div class="item-name">{{formProduct.name}}</div>    
            <div><span class="remove-link" @click="removeFormProduct(formProduct.id)"></span></div>
    </div>
<template>

<script>
import {mapActions, mapState} from "vuex";

export default {
  data() {
    return {
      quantity: 1
    }
  },
  name: "FormProductItem",
  props: {
    formProduct: {
      type: Object,
      default: () => {}
    }
  },
  mounted() {
        this.quantity = this.formProduct.quantity;
  },
  computed: {
    ...mapState("calc", ["bundle"]),
  },
  methods: {
    ...mapActions("calc", ["removeFormProduct"]),
    updateQuantity() {
        if (this.quantity==0){
            this.removeFormProduct(this.formProduct.id);
        }else {
            this.formProduct.quantity = this.quantity;
        }
    },
  }
}
</script>


calc.js

import axios from "axios";
import { toRaw } from 'vue';
import {StatusCodes} from "http-status-codes";
import {apiConfig, apiConfigPatch, formConfig} from "../../../utils/settings.js";

function getAlertStructure() {
    return {
        type: null,
        message: null
    };
}

const state = () => ({
    bundle: {
        "products": [],
    },
});

const actions = {
    async removeFormProduct({ state, commit, dispatch }, FormProductId) {
        let index=state.bundle.products.findIndex(e => e.id == FormProductId);
        // console.log("index"+index);
        delete state.bundle.products[index];

        commit('setProducts', state.bundle.products);
        commit('getBundlesProducts');
    },
};
const getters = {
    totalFormProducts(state) {
        if (!state.bundle.products) {
            return 0;
        }
        return state.bundle.products.length;
    },
    getBundlesProducts(state){
       return [...state.bundle.products]
    }
};
const mutations = {
    setProducts(state, products){
        state.bundle.products=products;
    },
    setProductToForm(state, value) {
        let id=value.id;
        let products=state.bundle.products;
        let index=products.findIndex(x => x.id === id);

        if (index!=-1){
            state.bundle.products[index].quantity=state.bundle.products[index].quantity+1;
        }else{
            state.bundle.products.push({
                    "id": value.id,
                    "price": value.price,
                    "quantity": 1,
                    "maxQuantity": value.quantity,
                    "name": value.name,
                    "images": value.images
            });
        }
    },
};
</script>

ProductItem.vue
<template>
    <div class="calc-item" :title="product.name" @click="setProductToForm(product)">
        <div class="name">{{product.name}}</div>
    </div>
</template>

<script>
import {mapActions, mapMutations, mapState} from "vuex";

export default {
  name: "ProductItem",
  props: {
    product: {
      type: Object,
      default: () => {}
    }
  },
  computed: {
    ...mapState("calc", ["menu"]),
  },
  methods: {
    ...mapMutations("calc", ["setProductToForm"]),
  };


У меня не работают две вещи:
1)Не удаляется элемент с помощью функции "removeFormProduct", возникает ошибка "Uncaught (in promise) Error: [vuex] do not mutate vuex store state outside mutation handlers." Не удаляется элемент products . Почему?
2)Когда я кликаю на компоненту ProductItem, функция setProductToForm(product) первый раз, срабатывает добавление (те добавляется в массив bundle.products). При повторном клике на setProductToForm(product), почему то количество не прибавляется.
3) Неправильно выводится секция при наличии (т.е. state.bundle.products.length>0)
<div v-if="totalFormProducts" >
            yes
</div>
  • Вопрос задан
  • 52 просмотра
Пригласить эксперта
Ваш ответ на вопрос

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

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