Vue+Vuex 實現(xiàn)商品購物車全選/反選栅哀,計算數(shù)量金額,商品刪除

首先壳嚎,商品列表是v-for 動態(tài)獲取渲染席爽,使用v-model的雙向綁定$store.getters中數(shù)據(jù),為了保持選中狀態(tài)伴栓,將數(shù)據(jù)保存到localStorage中伦连,部分具體代碼如下:

li中checkbox代碼

<input name="checkbox" value="Item 1" type="checkbox"
 ref="checkbox" @change="checked(item.id,$store.getters.getGoodsChecked[item.id])"
 v-model="$store.getters.getGoodsChecked[item.id]"> 

main.js中Vuex

var store = new Vuex.Store({
    state: { //this.$store.state.xxx
        cart: cart,
        checkAllStatus: checkAllStatus
    },
    mutations: { //this.$store.commit('function',xx)
        addToCart(state, goodsinfo) { //點擊加入購物車,保存商品信息
                var flag = false; //假設(shè)沒有新加入的商品
                state.cart.some(item => {
                    if (item.id == goodsinfo.id) {
                        item.count += parseInt(goodsinfo.count);
                        flag = true;
                        return true;
                    }
                })
                if (!flag) { //添加到購物車
                    state.cart.push(goodsinfo);
                }
                //保存到本地存儲
                localStorage.setItem('cart', JSON.stringify(state.cart));
            },
            updateGoodsInfo(state, goodsinfo) { //修改購物車商品數(shù)量值
                state.cart.some(item => {
                        if (item.id == goodsinfo.id) {
                            item.count = parseInt(goodsinfo.count);
                            return true;
                        }
                    })
                    //保存最近修改的購物車數(shù)據(jù)
                localStorage.setItem('cart', JSON.stringify(state.cart));
            },
            deleteStoreCart(state, id) {
                state.cart.some((item, index) => {
                        if (item.id == id) {
                            state.cart.splice(index, 1);
                        }
                    })
                    //保存到本地存儲
                localStorage.setItem('cart', JSON.stringify(state.cart));
            },
            //更新選中狀態(tài)
            updateGoodsChecked(state, info) {
                state.cart.some(item => {
                    if (item.id == info.id) {
                        item.checked = info.checked;
                    }
                })
                localStorage.setItem('cart', JSON.stringify(state.cart));
            },
            //全選/反選切換
            updateGettersGoodsChecked(state, boolean) {
                state.cart.forEach(item => {
                    item.checked = boolean;
                   // console.log('----' + item.checked);

                });
                state.checkAllStatus.status = boolean;


                // state.checkAllStatus = boolean;
                localStorage.setItem('checkAllStatus', JSON.stringify(state.checkAllStatus));

                localStorage.setItem('cart', JSON.stringify(state.cart));
            },

    },
    getters: { //this.$store.getters.xxx
        //獲取購物車總數(shù)量
        getAllCount(state) {
                var sum = 0;
                state.cart.forEach(item => {
                    sum += item.count;
                })
                return sum;
            },
            //獲取購物車的選擇狀態(tài)
            getGoodsChecked(state) {
                var temp = {}
                state.cart.forEach(item => {
                    temp[item.id] = item.checked;
                })

                return temp;
            },
            //獲取選中數(shù)量和計算商品價格
            getGoodsSumAndTotal(state) {
                var temp = {
                    sum: 0,
                    total: 0
                }
                state.cart.forEach(item => {
                    if (item.checked) {
                        temp.sum += item.count;
                        temp.total += (item.price * 100) * temp.sum / 100;
                    }
                })
                return temp;
            }

    }
})

組件 shopcart.vue 中script 部分

export default {
    data() {
            return {
                cart: '',
                value: [],
                options: ['全選'],
                ischecked: 0,
                checkedSum: 0
                    //checkAllStatus: true
            }
        },
        created() {

        },
        methods: {
            //全選
            checkAll() {
                    var obj = this.$store.getters.getGoodsChecked;
                    this.ischecked = Object.values(obj);
                    this.checkedSum = Object.keys(obj).length;

                    if (this.$refs.checkAll.checked) {
                        for (var i = 0; i < this.ischecked.length; i++) {
                            this.ischecked[i] = true;
                        }
                        this.$store.commit('updateGettersGoodsChecked', true);
                    } else {
                        for (var i = 0; i < this.ischecked.length; i++) {
                            this.ischecked[i] = false;
                        }
                        this.$store.commit('updateGettersGoodsChecked', false);
                    }
                    console.log('選中狀態(tài)' + this.$refs.checkAll.checked);
                },
                //單個選擇
                checked(id, value) {
                    console.log(id + '------' + value);
                    if (!value) {
                        this.$store.state.checkAllStatus = false;
                        localStorage.setItem('checkAllStatus', JSON.stringify(false));
                    }
                    this.$store.commit('updateGoodsChecked', {
                        id, checked: value
                    });
                    //獲取商品所有列表的checked狀態(tài)
                    var obj = this.$store.getters.getGoodsChecked;
                    //將對象的checked值轉(zhuǎn)換存入一個新數(shù)組
                    this.ischecked = Object.values(obj);
                    var arr = [];
                    for (let i in this.ischecked) {
                        arr.push(this.ischecked[i]);
                    }
                    //every判斷數(shù)組的每一項的選中狀態(tài)
                    var result=arr.every(item => {
                       return item == true;
                    })
                    //賦值給全選按鈕
                    if (result) {
                         this.$store.state.checkAllStatus = true;
                    }else{
                         this.$store.state.checkAllStatus = false;
                    }
                    //本地存儲狀態(tài)
                    localStorage.setItem('checkAllStatus', JSON.stringify(result));

                    console.log('所有選中狀態(tài):' + result);
                    console.log(arr);

                },
                getnum(num, maxnum) { //定義接收子組件數(shù)據(jù)的處理方法
                    //賦值給自己data num  數(shù)量選擇檢測
                    // this.num = num;
                    if (num > maxnum) {
                        this.num = maxnum;
                        Toast({
                            message: '該商品最多購買' + maxnum + '件',
                            position: 'middle',
                            duration: 3000
                        });
                    }
                },
                //刪除購物車數(shù)據(jù)store和cart本地數(shù)據(jù)
                deleteCart(id, index) {
                    this.cart.splice(index, 1);
                    this.$store.commit('deleteStoreCart', id);
                }
        },
        computed: {

        },
        components: {
            cartnumbox
        },
        mounted() {
            //頁面加載完畢獲取本地存儲的cart數(shù)據(jù)
            this.$nextTick(function() {
                var cart = JSON.parse(localStorage.getItem('cart') || '[]');
                this.cart = cart;
                // var checkAllStatus = JSON.parse(localStorage.getItem('checkAllStatus') || '[]');
                // this.checkAllStatus = checkAllStatus;
                //console.log(this.cart);
            });

        },
        watch: {

        }
}

自此,購物車基本功能完成钳垮,頁面刷新頁可以保持住當(dāng)前狀態(tài)

vuex-checkbox.gif
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末惑淳,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子饺窿,更是在濱河造成了極大的恐慌歧焦,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件肚医,死亡現(xiàn)場離奇詭異绢馍,居然都是意外死亡,警方通過查閱死者的電腦和手機肠套,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進店門舰涌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人你稚,你說我怎么就攤上這事瓷耙≈焯桑” “怎么了?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵搁痛,是天一觀的道長长搀。 經(jīng)常有香客問我,道長鸡典,這世上最難降的妖魔是什么源请? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮彻况,結(jié)果婚禮上谁尸,老公的妹妹穿的比我還像新娘。我一直安慰自己疗垛,他們只是感情好症汹,可當(dāng)我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著贷腕,像睡著了一般背镇。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上泽裳,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天瞒斩,我揣著相機與錄音,去河邊找鬼涮总。 笑死胸囱,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的瀑梗。 我是一名探鬼主播烹笔,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼抛丽!你這毒婦竟也來了谤职?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤亿鲜,失蹤者是張志新(化名)和其女友劉穎允蜈,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蒿柳,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡饶套,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了垒探。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片妓蛮。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖圾叼,靈堂內(nèi)的尸體忽然破棺而出蛤克,到底是詐尸還是另有隱情扔仓,我是刑警寧澤,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布咖耘,位于F島的核電站,受9級特大地震影響撬码,放射性物質(zhì)發(fā)生泄漏儿倒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一呜笑、第九天 我趴在偏房一處隱蔽的房頂上張望夫否。 院中可真熱鬧,春花似錦叫胁、人聲如沸凰慈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽微谓。三九已至,卻和暖如春输钩,著一層夾襖步出監(jiān)牢的瞬間豺型,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工买乃, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留姻氨,地道東北人。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓剪验,卻偏偏與公主長得像肴焊,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子功戚,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,627評論 2 350