使用Vue做一個購物車

個人博客地址: https://cyixlq.top/

前言

最近我實習(xí)的公司在做網(wǎng)上商城的一個項目筷凤,我負責(zé)購物車這一塊。這個項目是一個Web項目藐守,沒有進行前后端分離挪丢,但是又得做手機端,感覺好像哪里不對乾蓬。。任内。
web框架使用的是SpringMVC融柬,模板框架是FreeMarker,想到以后要做移動端,果斷還是用json來進行數(shù)據(jù)交互摘盆,并沒有用freemarker狼渊。網(wǎng)頁靜態(tài)文件全部寫好了,放在了springmvc的Views中类垦。按理來說還是進行前后端分離好點的囤锉,但是做網(wǎng)頁的沒接觸過Vue,那好吧护锤。。酿傍。
于是我就想到在頁面直接引入Vue烙懦,可是又是在內(nèi)網(wǎng)環(huán)境開發(fā),只好在自己個人筆記本上下載vue.js再拷貝到內(nèi)網(wǎng)電腦上進行頁面上的引入赤炒。

正文

首先讓我們看一下靜態(tài)頁面的效果圖:
靜態(tài)頁面效果圖
簡單說一下這個功能模塊的需求:
  1. 勾選全選氯析,所有商品全部選中。在取消全選框的時候所有商品取消選擇莺褒。
  2. 點擊單個商品上的加號減號進行數(shù)量的增加和減少掩缓,右邊小計實時計算出這個商品的價格合計。
  3. 點擊單個商品上的刪除按鈕將商品從購物車中刪除遵岩。
  4. 底部已選實時顯示已經(jīng)勾選的商品你辣,右邊合計金額實時顯示所有勾選的商品的小計之和。
    (是的尘执,需求看起來不多舍哄,但是要結(jié)合后臺去做還是需要點功夫的,但是這篇文章我們不牽扯后臺誊锭,在前臺造數(shù)據(jù))
現(xiàn)在讓我們開始吧

表悬,創(chuàng)建一個Vue對象,設(shè)置好數(shù)據(jù)丧靡。

var cart; //全局Vue對象
//通過封裝一個方法來創(chuàng)建Vue對象
function createVue(list) {  //傳入通過后臺獲取的list
  cart = new Vue({
    el:'#cart',
    data(){
        return {
            list:list  //商品列表
        }
    }
  });
}

蟆沫,假設(shè)從后臺請求到數(shù)據(jù),然后賦值到Vue對象中

window.onload = function () {
        //請求后臺代碼   温治。饭庞。。罐盔。
        //請求成功后將獲得的list賦值給cart的list
        let list = [
            {
                goodsTitle: "衛(wèi)龍辣條",                         //商品名
                specifications: "大包",                        //商品規(guī)格
                unitPrice: "5",                               //商品單價
                subimage1Filename :"20180317eeftyd.jpg",        //商品圖片名
                purchaseQuantity: 6                     //商品數(shù)量
            }, 
            {
                goodsTitle: "雕牌洗衣粉",
                specifications: "大包",
                unitPrice: "13",
                subimage1Filename: "20180317ggptfg.jpg",
                purchaseQuantity: 1
            }, 
            {
                goodsTitle: "旺仔牛奶",
                specifications: "20盒裝",
                unitPrice: "45",
                subimage1Filename: "20180317feftyp.jpg",
                purchaseQuantity: 1
            }];
            createVue(list);  //執(zhí)行創(chuàng)建Vue對象方法
    }
);

但绕,修改html部分代碼,將數(shù)據(jù)展示出來

<tr v-for="(item,index) in list">
  <td>
    <input type="checkbox" :id="'check'+index" name="checkboxs" />
    <label :for="'check'+index"></label>
  </td>
  <td>
    <img :src="'路徑前綴/'+item.subimage1Filename" />
  </td>
  <td style="text-align:left;">
    <p>{{item.goodsTitle}}</p>
    <p>規(guī)格:{{item.specifications}}</p>
  </td>
  <td>¥{{item.unitPrice}}</td>
  <td class="adddel">
    <em v-on:click="minius(index)">-</em>
    <input type="number" v-model.number="item.purchaseQuantity" />
    <em v-on:click="add(index)">+</em>
  </td>
  <td>¥{{item.unitPrice * item.purchaseQuantity}}</td>
  <td><button v-on:click="checkDel(index)">刪除</button></td>
</tr> 

這樣就能將單個商品部分全部循環(huán)打印出來,并且將對應(yīng)的信息打印在對應(yīng)位置捏顺。效果圖如下:

效果圖六孵,圖中的圖片名和路徑是我編的,所以找不到

幅骄,實現(xiàn)全選和勾選時候總價的計算劫窒,這部分算是有點挑戰(zhàn)了。我的思路是在Vue對象中新增加一個數(shù)據(jù)用來標識商品的選中狀態(tài)拆座,所以創(chuàng)建Vue方法中的代碼改成如下所示:

cart = new Vue({
    el: '#cart',
        data() {
            return {
                list: list,
                checkeds: new Array(list.length) //初始化成list的長度
        }
    });

然后在html中將商品對應(yīng)的checkbox與checkeds綁定起來,修改后的代碼如下:

<input type="checkbox" :id="'check'+index" name="checkboxs" v-model="checkeds[index]" />

利用computed屬性計算價格總和:

sum () {
    let sum = 0;
    for (let i in this.list) {
        if (this.checkeds[i])  //如果checkeds[i]的結(jié)果為truth主巍,則進行累加
          sum += this.list[i].unitPrice * this.list[i].purchaseQuantity;
    }
    return sum;
}

HTML部分,我們在對應(yīng)位置用{{sum}}帶入就能進行顯示了挪凑。這樣就能實現(xiàn)計算勾選過的商品小計之和了孕索。接下來實現(xiàn)全選功能,在methods屬性中添加一個方法checkAll躏碳,具體代碼如下:

checkAll (event) {  //這里的event就是全選checkbox對象
    if (event.checked) {  //如果全選的checkbox選中搞旭,將checkeds所有的值設(shè)置為true,對應(yīng)商品checkbox的選中狀態(tài)自動更新
        for (let i = 0; i < this.checkeds.length; i++) {
            Vue.set(this.checkeds, i, true);
        }
     else {  //否則就進行與上面相反的操作
        for (let i = 0; i < this.checkeds.length; i++) {
            Vue.set(this.checkeds, i, false);
        }
    }
}

經(jīng)過上面的一波操作菇绵,已經(jīng)可以實現(xiàn)全選和點選時候的價格之和計算肄渗。我們還要統(tǒng)計商品選中的數(shù)量,這個很簡單咬最,同樣使用computed屬性翎嫡,對checkeds中結(jié)果為truth的進行統(tǒng)計就好了,代碼如下:

checkNum: function () {
    let num = 0;
    for (let i in this.checkeds) {
        if (this.checkeds[i]) {
            num++;
        }
    }
    return num;
}

然后在html中的對應(yīng)位置用{{checkNum}}代入即可∮牢冢現(xiàn)在我們已經(jīng)實現(xiàn)了近一半需求惑申,讓我們繼續(xù)完成他們吧!
翅雏,實現(xiàn)購物車物品單個刪除功能硝桩,這個就很簡單啦,我們在methods中增加一個del方法枚荣,使用js數(shù)組的splice方法就可以實現(xiàn)碗脊。

del (index) {
    this.list.splice(index, 1);  //只需要從數(shù)組中移除對應(yīng)項,視圖會自動更新橄妆,不得不說衙伶,Vue太棒啦!
    this.checkeds.splice(index,1); //同時刪除對應(yīng)的選中狀態(tài)標識
}

然后就是給刪除按鈕綁定點擊事件(index是循環(huán)列表時候的下標):

<button v-on:click="del(index)">刪除</button>

這樣我們就輕松實現(xiàn)了刪除單個商品的需求害碾,當(dāng)然防止用戶誤刪矢劲,在用戶點擊刪除按鈕時我們可以彈出一個確認框提示用戶,這里我們就不去實現(xiàn)了慌随。
芬沉,實現(xiàn)購物車單個商品的數(shù)量增加躺同,減少,并實時更新商品的小計丸逸。首先在methods中添加增加方法add和減少方法minius:

add (index) {
    this.list[index].purchaseQuantity++;  //這里按理來說應(yīng)該查詢后臺對應(yīng)商品庫存量來進行限制的蹋艺,這里不涉及到后臺所以沒加
},
minius (index) {
    if (this.list[index].purchaseQuantity > 1) {  //這里添加一個限制,最少要有一個商品
        this.list[index].purchaseQuantity--;
    }
}

然后我們在對應(yīng)的加和減的按鈕上綁定事件來觸發(fā)這兩個方法(index為列表循環(huán)時候的下標):

<td class="adddel">
    <em v-on:click="minius(index)">-</em>
    <input type="number" v-model.number="item.purchaseQuantity" />
    <em v-on:click="add(index)">+</em>
</td>
<td>¥{{item.unitPrice * item.purchaseQuantity}}</td>

從上面的代碼可以看到我們在小計一欄直接進行商品單價和數(shù)量相乘黄刚,這樣就可以實現(xiàn)實時更新了捎谨。

至此,我們的需求就算是完成了憔维,最后給大家留兩個小問題思考一下

涛救,如何實現(xiàn)批量刪除?
业扒,在全選之后检吆,我們?nèi)∠艘粋€商品的狀態(tài),全選框的選中狀態(tài)仍然是選中的程储,此時應(yīng)該是不選中的咧栗,或者當(dāng)我們一個一個把商品的選中狀態(tài)全部勾選,全選框的狀態(tài)仍然是補選中的虱肄,此時應(yīng)該是選中狀態(tài)(如下兩圖所示),這個現(xiàn)象如何解決交煞?

問題二的現(xiàn)象一

問題二的現(xiàn)象二

后文

本文的所有代碼已經(jīng)托管到GitHub咏窿,如果本文代碼有誤,請以GitHub上的為準素征,GitHub地址:https://github.com/cyixlq/vue_shopping_cart

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末集嵌,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子御毅,更是在濱河造成了極大的恐慌根欧,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件端蛆,死亡現(xiàn)場離奇詭異凤粗,居然都是意外死亡,警方通過查閱死者的電腦和手機今豆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進店門嫌拣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人呆躲,你說我怎么就攤上這事异逐。” “怎么了插掂?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵灰瞻,是天一觀的道長腥例。 經(jīng)常有香客問我,道長酝润,這世上最難降的妖魔是什么燎竖? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮袍祖,結(jié)果婚禮上底瓣,老公的妹妹穿的比我還像新娘。我一直安慰自己蕉陋,他們只是感情好捐凭,可當(dāng)我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著凳鬓,像睡著了一般茁肠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上缩举,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天垦梆,我揣著相機與錄音,去河邊找鬼仅孩。 笑死托猩,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的辽慕。 我是一名探鬼主播京腥,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼溅蛉!你這毒婦竟也來了公浪?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤船侧,失蹤者是張志新(化名)和其女友劉穎欠气,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體镜撩,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡预柒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了袁梗。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片卫旱。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖围段,靈堂內(nèi)的尸體忽然破棺而出顾翼,到底是詐尸還是另有隱情,我是刑警寧澤奈泪,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布适贸,位于F島的核電站灸芳,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏拜姿。R本人自食惡果不足惜烙样,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蕊肥。 院中可真熱鬧谒获,春花似錦、人聲如沸壁却。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽展东。三九已至赔硫,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間盐肃,已是汗流浹背爪膊。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留砸王,地道東北人推盛。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像谦铃,于是被迫代替她去往敵國和親耘成。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,927評論 2 355

推薦閱讀更多精彩內(nèi)容