摘要:歡迎你們跟著閏土大叔走進(jìn)時(shí)代。其中購買數(shù)量可以增加或減少,每類商品還可以從購物車中移除。后記這大概就是一次用重構(gòu)電商項(xiàng)目中的購物車模塊的所有實(shí)現(xiàn)過程。作者閏土大叔鏈接來源掘金著作權(quán)歸作者所有。
前言
從這篇文章開始,我準(zhǔn)備給大家分享一些關(guān)于Vue.js這門框架的技巧性系列文章,正好我們公司項(xiàng)目中也用到了Vue。所以,教是最好的學(xué)。進(jìn)階篇比較適合于二三線城市,還在小廠打拼的童鞋們。歡迎你們跟著閏土大叔走進(jìn)MVVM時(shí)代。
首先,需要聲明一點(diǎn),本篇文章不會從基礎(chǔ)開始講起,因?yàn)閂ue官方文檔已經(jīng)講得很清楚了,我就不再贅述了。所以,之前對Vue這門框架不太熟悉的童鞋可以先去官網(wǎng)上看看基礎(chǔ)知識,比如Vue的模板語法、計(jì)算屬性、條件渲染、列表渲染、事件處理、表單輸入綁定以及Class與Style綁定等。進(jìn)階篇我會側(cè)重講點(diǎn)官網(wǎng)入門指南沒講到的、偏技巧性的東西。
那么接下來,搬好小板凳,正文從這開始~
在開始寫購物車的業(yè)務(wù)代碼前,我們需要對需求進(jìn)行分析,這樣有助于我們理清業(yè)務(wù)邏輯。首先,購物車需要展示一個(gè)已加入購物車的商品列表,包含商品的名稱、單價(jià)、購買數(shù)量和操作等信息,還需要實(shí)時(shí)顯示購買的總價(jià)。其中購買數(shù)量可以增加或減少,每類商品還可以從購物車中移除。最終實(shí)現(xiàn)的效果如下圖所示:
在明確需求之后,我們就可以開始動手敲代碼了?;A(chǔ)篇都會以直接引入Vue.js文件為例。先在index.html中引入Vue.js,然后創(chuàng)建一個(gè)根元素來掛載Vue實(shí)例,在data選項(xiàng)內(nèi)寫入我們需要的數(shù)據(jù)列表,里面包含了商品名稱、單價(jià)、購買數(shù)量。這里需要說明一下,在實(shí)際業(yè)務(wù)中,這個(gè)列表是通過Ajax從服務(wù)端動態(tài)獲取的,這里只做示例:
1 var app = new Vue({ 2 el:"#app", 3 data:{ 4 list:[ 5 { 6 id:1, 7 name:"iphone X", 8 price:8388, 9 count:1 10 }, 11 { 12 id:2, 13 name:"apple watch3", 14 price:2888, 15 count:1 16 }, 17 { 18 id:3, 19 name:"MackBook Pro", 20 price:12488, 21 count:1 22 } 23 ] 24 } 25 })
數(shù)據(jù)構(gòu)建好之后,我們便可以在index.html中展示列表了,毫無疑問的是,肯定會用到v-for指令。為了考慮到用戶體驗(yàn),我們在這里需要做一點(diǎn)小小的優(yōu)化。因?yàn)槊總€(gè)商品都是可以從購物車刪除的,所以當(dāng)列表為空時(shí),在頁面顯示一個(gè)“購物車為空”的提示會更加友好,我們可以通過判斷數(shù)組list的長度來實(shí)現(xiàn)該功能:
1Tips: 解決Vue初始化慢導(dǎo)致頁面閃動的最佳實(shí)踐2 34 5
296 12 13 147 商品名稱 8商品單價(jià) 9購買數(shù)量 10操作 1115 27 28{{ index+1 }} 16{{ item.name }} 17{{ item.price }} 1819 20 {{ item.count }} 21 22 2324 25 26總價(jià):¥ {{ totalPrice }}
30 31購物車為空32
相信眼尖的同學(xué)會發(fā)現(xiàn)一個(gè)比較陌生的指令v-cloak,它究竟是干嘛的?官網(wǎng)指南里也沒提到啊...
這里抖一個(gè)小包袱,論解決Vue初始化慢導(dǎo)致頁面閃動的最佳實(shí)踐。你可能會發(fā)現(xiàn),當(dāng)網(wǎng)速較慢、Vue.js文件還沒加載完時(shí),在頁面上會顯示 {{ 插值 }} 的字樣,知道Vue創(chuàng)建實(shí)例、編譯模板時(shí),DOM才會被替換,所以這個(gè)過程屏幕是有閃動的。于是,v-cloak指令應(yīng)運(yùn)而生,你只需要在根元素上添加上這個(gè)指令,然后在CSS中添加上一句:
1 [v-cloak]{ 2 display:none; 3 }
就可以完美的解決這個(gè)問題了。但需要注意的是,v-cloak對于簡單的項(xiàng)目很實(shí)用,但是在具有webpack工程化的項(xiàng)目里,項(xiàng)目的HTML結(jié)構(gòu)只有一個(gè)空的div元素,剩余的內(nèi)容都是由路由去掛載不同組件完成的,所以不再需要v-cloak。
讓我們接著說回購物車的事情??們r(jià)totalPrice是依賴于商品列表而動態(tài)變化的,所以我們要考慮用計(jì)算屬性來實(shí)現(xiàn),順便將結(jié)果轉(zhuǎn)化為帶有“千位分隔符”的數(shù)字。
1 computed:{ 2 totalPrice: function(){ 3 var total = 0; 4 for(var i=0;i這段代碼的難點(diǎn)在于千位分隔符的轉(zhuǎn)換(每隔三位數(shù)加進(jìn)一個(gè)逗號),各位童鞋可以查閱正則匹配的相關(guān)內(nèi)容后嘗試了解replace()的正則含義。
Tips: 什么是語法糖
最后就剩下商品列表的渲染和相關(guān)的幾個(gè)操作了。先是用v-for指令把數(shù)組list循環(huán)出來。商品序號、名稱、單價(jià)、數(shù)量都是直接使用插值來完成的,在第4列的兩個(gè)按鈕語法糖就是指在不影響功能的情況下,添加了某種方法實(shí)現(xiàn)同樣的效果。
讓我們接著說回button綁定的動態(tài)屬性disabled,每件商品購買數(shù)量最少是1件,所以當(dāng)count為1時(shí),不允許再繼續(xù)減少,所以這里給1 methods:{ 2 handleReduce: function(index){ 3 if(this.list[index].count === 1) return; 4 this.list[index].count--; 5 }, 6 handleAdd: function(index){ 7 this.list[index].count++; 8 }, 9 handleRemove: function(index){ 10 this.list.splice(index, 1); 11 } 12 }這3個(gè)方法都是直接對數(shù)組list的操作,沒有太復(fù)雜的邏輯。需要說明的是,雖然在button上已經(jīng)綁定了disabled特性,但是在handleReduce方法內(nèi)又判斷了一遍。這是因?yàn)樵谀承r(shí)候,可能不一定會用button標(biāo)簽,也可能是div、span等,給它們增加disabled是沒有任何作用的,所以為了安全起見,在業(yè)務(wù)邏輯中再判斷一次,避免因修改HTML模板后出現(xiàn)bug。
后記這大概就是一次用Vue重構(gòu)電商項(xiàng)目中的購物車模塊的所有實(shí)現(xiàn)過程。這可能是你們學(xué)習(xí)Vue.js框架的一小步,卻是我當(dāng)Vue講師夢想邁出的一大步。
作者:閏土大叔
鏈接:https://juejin.im/post/5a52e6...
來源:掘金
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。想了解我的更多動態(tài)?歡迎關(guān)注我的微信公眾號:閏土大叔 ,或者添加我的個(gè)人微信號:wxd91traveler。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/90755.html
摘要:最佳實(shí)踐良好的編碼規(guī)范單元測試持續(xù)集成文檔,從一開始就形成良好的編碼習(xí)慣。真實(shí)的電商業(yè)務(wù)所有的業(yè)務(wù)需求來自真實(shí)的客戶,并且線上良好運(yùn)營中。 重要通知: Laravel + 小程序的開源電商版本源碼已經(jīng)在 github 上拉,歡迎提交 issue 和 star :) 開源電商 Server 端: Laravel API源碼 開源電商 client 端:小程序源碼 iBrand 簡介...
摘要:建議閱讀博客前端工程基礎(chǔ)篇鏈接書籍深入淺出鏈接服務(wù)器端的是在年正式提出并開源的,傳統(tǒng)的都運(yùn)行在瀏覽器這樣的宿主環(huán)境中,而基于谷歌瀏覽器的引擎構(gòu)建的運(yùn)行環(huán)境,使用了一個(gè)事件驅(qū)動非阻塞式的模型,將帶入服務(wù)器領(lǐng)域。 1.網(wǎng)頁布局HTML+CSS 技能要求 學(xué)會用工具(如PS)切圖,將設(shè)計(jì)稿還原成網(wǎng)頁布局 掌握常規(guī)布局方法:文檔流布局,flex布局,grid布局,居中,浮動…… HTML5...
摘要:建議閱讀博客前端工程基礎(chǔ)篇鏈接書籍深入淺出鏈接服務(wù)器端的是在年正式提出并開源的,傳統(tǒng)的都運(yùn)行在瀏覽器這樣的宿主環(huán)境中,而基于谷歌瀏覽器的引擎構(gòu)建的運(yùn)行環(huán)境,使用了一個(gè)事件驅(qū)動非阻塞式的模型,將帶入服務(wù)器領(lǐng)域。 1.網(wǎng)頁布局HTML+CSS 技能要求 學(xué)會用工具(如PS)切圖,將設(shè)計(jì)稿還原成網(wǎng)頁布局 掌握常規(guī)布局方法:文檔流布局,flex布局,grid布局,居中,浮動…… HTML5...
摘要:建議閱讀博客前端工程基礎(chǔ)篇鏈接書籍深入淺出鏈接服務(wù)器端的是在年正式提出并開源的,傳統(tǒng)的都運(yùn)行在瀏覽器這樣的宿主環(huán)境中,而基于谷歌瀏覽器的引擎構(gòu)建的運(yùn)行環(huán)境,使用了一個(gè)事件驅(qū)動非阻塞式的模型,將帶入服務(wù)器領(lǐng)域。 1.網(wǎng)頁布局HTML+CSS 技能要求 學(xué)會用工具(如PS)切圖,將設(shè)計(jì)稿還原成網(wǎng)頁布局 掌握常規(guī)布局方法:文檔流布局,flex布局,grid布局,居中,浮動…… HTML5...
閱讀 2650·2023-04-26 02:17
閱讀 1628·2021-11-24 09:39
閱讀 1087·2021-11-18 13:13
閱讀 2670·2021-09-02 15:11
閱讀 2786·2019-08-30 15:48
閱讀 3416·2019-08-30 14:00
閱讀 2451·2019-08-29 13:43
閱讀 668·2019-08-29 13:07