Посмотрите селектор выбора количества с Vue 3

#javascript #vuejs3 #shopping-cart

Вопрос:

Я пытаюсь сделать быструю корзину покупок с помощью существующего проекта.

Мой список элементов уже сгенерирован php, и я получаю работу с такими html-элементами :

 const billets = document.querySelectorAll(".card-billet");

var products = [];

billets.forEach(billet => {
    products.push({
        title: billet.querySelector('.card-billet-title').textContent,
        price: billet.dataset.price,
        qty: billet.querySelector('select[name="billet_quantity"]').value
    });
});

const App = {
    data() {
        return {
            items: products
        }
    },
    watch: {
        items: function () {
            console.log("watched");
        },
    },
    computed: {
        total: function () {
            console.log(this.items)

            let total = 0.00;
            this.items.forEach(item => {
                total  = (item.price * item.qty);
            });
            return total;
        }
    }
}

Vue.createApp(App).mount('#checkoutApp')
 

Это работает, но только при загрузке страницы, но я пытаюсь изменить общее количество, когда меняется выбранное количество.

Я немного растерян, чтобы добиться этого, должен ли я использовать часы, но на чем ? Или что-нибудь еще ?

Комментарии:

1. можете ли вы показать часть кода, которая изменяет items массив?

Ответ №1:

Наконец я нашел, как этого добиться, проблема заключалась в том, что мой массив находился вне экземпляра vue, поэтому его нельзя было обновить.

Я упростил код следующим образом :

 const App = {
    data() {
        return {
            items: []
        }
    },
    methods: {
        onChange: function (e) {
            // console.log(this.items)
            this.items = [];

            document.querySelectorAll(".card-billet").forEach(billet => {
                this.items.push({
                    title: billet.querySelector('.card-billet-title').textContent,
                    price: billet.dataset.price,
                    qty: billet.querySelector('.card-billet-qty-selector').value
                });
            });
        }
    },
    computed: {
        total: function () {
            // console.log(this.items)

            let total = 0.00;
            this.items.forEach(item => {
                total  = (item.price * item.qty);
            });
            return total;
        }
    }
}

Vue.createApp(App).mount('#checkoutApp')