微信小程序?qū)崿F(xiàn)簡(jiǎn)單購物車功能
這個(gè)微信小程序的購物車功能,通過參照各大電商平臺(tái)的功能和界面,然后總結(jié)出來的。
效果圖
功能描述
1、可單選,全選/取消全選
2、增加、減少、手動(dòng)編輯商品的數(shù)量
3、根據(jù)商品的數(shù)量統(tǒng)計(jì)價(jià)格
代碼實(shí)現(xiàn)
此處省略一萬字,廢話不多說,直接上代碼吧!
WXML靜態(tài)布局、綁定“死”數(shù)據(jù)(主要功能代碼)
<view class="list"> <block wx:for="{{dataArr}}" wx:key="index" wx:for-item="item"> <view class="li clearfix"> <!-- 單品選擇按鈕 --> <view class="check" wx:if="{{item.selected}}" bindtap="selectList" data-index="{{index}}"><text class="iconfont icon-dagou"></text></view> <view class="check" wx:else bindtap="selectList" data-index="{{index}}"><text class="iconfont icon-choose"></text></view> <view class="img fl"><image src="{{item.image}}" mode="aspectFill"></image></view> <view class="right fr"> <view class="title ellipsis-2">{{item.title}}</view> <!-- 增加減少編輯數(shù)量 --> <view class="num_w clearfix"> <view class="fl" bindtap="minusCount" data-index="{{index}}">-</view> <view class="fl num"><input type="number" value="{{item.num}}" bindinput="inputCount" bindblur="bindblur" data-index="{{index}}" /></view> <view class="fl" bindtap="addCount" data-index="{{index}}">+</view> </view> <view class="price">¥{{item.price}}</view> </view> </view> </block> </view> <view class="bottom clearfix"> <!-- 全選/取消全選按鈕 --> <view class="check fl"> <text class="iconfont icon-dagou" wx:if="{{selectAllStatus}}" bindtap="selectAll"></text> <text class="iconfont icon-choose" wx:else bindtap="selectAll"></text> <text class="text">全選</text> </view> <view class="button gradientButton fr"><button bindtap="toOrder">去結(jié)算</button></view> <!-- 總價(jià) --> <view class="price fr">合計(jì):<text>¥{{totalPrice}}</text></view> </view>
WXSS:樣式有點(diǎn)多,就不放上來啦,需要的可以留下你的郵箱地址哦
JS:
當(dāng)頁面剛加載進(jìn)來,當(dāng)然要先onShow一下,默認(rèn)全選,統(tǒng)計(jì)購物車?yán)锼猩唐返膬r(jià)格。PS:這里建議用onShow,因?yàn)槊看芜M(jìn)入購物車都需要重新加載數(shù)據(jù),而onLoad和onReady只在初始化的時(shí)候執(zhí)行一次。
onShow() { this.getTotalPrice(); }
統(tǒng)計(jì)總價(jià)(該頁面還有其它地方需要調(diào)用到這個(gè)方法)
// 統(tǒng)計(jì)總價(jià) getTotalPrice() { // 獲取購物車列表 let dataArr = this.data.dataArr; let total = 0; // 循環(huán)列表 for(let i = 0; i<dataArr.length; i++) { // 判斷選中才會(huì)計(jì)算價(jià)格 if(dataArr[i].selected) { // 所有價(jià)格加起來 total += dataArr[i].num * dataArr[i].price; } } // 賦值到data中渲染到頁面 this.setData({ dataArr: dataArr, totalPrice: total.toFixed(2) }); }
選擇商品(單選),通過 data-index="{{index}}" 把當(dāng)前商品在列表數(shù)組中的下標(biāo)傳給事件,在更改單個(gè)商品的狀態(tài)時(shí),也要注意全選的狀態(tài),還有重新統(tǒng)計(jì)總價(jià)。
// 選擇事件 selectList(e) { // 獲取data- 傳進(jìn)來的index let index = e.currentTarget.dataset.index; // 獲取購物車列表 let dataArr = this.data.dataArr; // 獲取當(dāng)前商品的選中狀態(tài) let selected = dataArr[index].selected; // 改變狀態(tài) dataArr[index].selected = !selected; this.setData({ dataArr: dataArr }); // 改變?nèi)x狀態(tài) for (var i=0; i<this.data.dataArr.length; i++){ // 當(dāng)狀態(tài)為全選時(shí),每個(gè)元素其中有一個(gè)為false,則取消全選 // 當(dāng)狀態(tài)為非全選時(shí),每個(gè)元素都為true,則全選 if(this.data.selectAllStatus){ if(!this.data.dataArr[i].selected){ this.setData({ selectAllStatus: false }); break; } }else { if(this.data.dataArr[i].selected){ this.setData({ selectAllStatus: true }); }else { this.setData({ selectAllStatus: false }); break; } } } // 重新統(tǒng)計(jì)總價(jià) this.getTotalPrice(); }
商品全選/取消全選,該狀態(tài)更改之后也要重新統(tǒng)計(jì)總價(jià)哦,包括后面的,我就不再提示了
// 全選事件 selectAll(e) { // 是否全選狀態(tài) let selectAllStatus = this.data.selectAllStatus; selectAllStatus = !selectAllStatus; let dataArr = this.data.dataArr; for (let i = 0; i < dataArr.length; i++) { // 改變所有商品狀態(tài) dataArr[i].selected = selectAllStatus; } this.setData({ selectAllStatus: selectAllStatus, dataArr: dataArr }); // 重新統(tǒng)計(jì)總價(jià) this.getTotalPrice(); }
另外,還有增加或減少數(shù)量的方法。
溫馨提示:減少數(shù)量時(shí)注意不能少于1(參考某寶商城的做法)
// 增加數(shù)量 addCount(e) { let index = e.currentTarget.dataset.index; let dataArr = this.data.dataArr; let num = dataArr[index].num; num = num + 1; dataArr[index].num = num; this.setData({ dataArr: dataArr }); // 重新統(tǒng)計(jì)總價(jià) this.getTotalPrice(); }, // 減少數(shù)量 minusCount(e) { let index = e.currentTarget.dataset.index; let dataArr = this.data.dataArr; let num = dataArr[index].num; if(num <= 1){ wx.showToast({ title: '寶貝不能再減少啦', icon: 'none' }) return false; } num = num - 1; dataArr[index].num = num; this.setData({ dataArr: dataArr }); // 重新統(tǒng)計(jì)總價(jià) this.getTotalPrice(); }
然后,還有手動(dòng)輸入數(shù)量的方法
// 輸入數(shù)量 inputCount(e) { let index = e.currentTarget.dataset.index; let dataArr = this.data.dataArr; let num = e.detail.value; dataArr[index].num = num; this.setData({ dataArr: dataArr }); // 重新統(tǒng)計(jì)總價(jià) this.getTotalPrice(); }
別忘了,手動(dòng)輸入數(shù)量也要有不能少于1的判斷哦,我這里是在input失去焦點(diǎn)時(shí)做的判斷,當(dāng)然也是參考某寶商城的做法
// 失去焦點(diǎn)時(shí)判斷數(shù)量是否小于1 bindblur(e) { let index = e.currentTarget.dataset.index; let dataArr = this.data.dataArr; let num = e.detail.value; if(num < 1){ wx.showToast({ title: '數(shù)量不能小于1', icon: 'none' }) num = 1; dataArr[index].num = num; this.setData({ dataArr: dataArr }); // 重新統(tǒng)計(jì)總價(jià) this.getTotalPrice(); } }
最后,就是去結(jié)算了,在處理完一堆噼里啪啦的業(yè)務(wù)之后,跳轉(zhuǎn)到結(jié)算頁面
// 去結(jié)算 toOrder() { // 處理數(shù)據(jù) // ***** // Author: Moss // QQ: 827291427 // ***** // 跳轉(zhuǎn)結(jié)算頁面 wx.navigateTo({ url: '/pages/shop/order/order' }) }
雖然,購物車的功能沒有太難,但是涉及到的微信小程序的知識(shí)點(diǎn)還是挺多的,可以從中學(xué)習(xí)并掌握!
希望能幫到瀏覽這篇文章的你,當(dāng)然更希望你能在閱讀之后自己能寫出來,而不是復(fù)制粘貼來敷衍任務(wù)。
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 微信小程序 購物車簡(jiǎn)單實(shí)例
- 微信小程序?qū)崙?zhàn)篇之購物車的實(shí)現(xiàn)代碼示例
- 微信小程序?qū)崿F(xiàn)購物車功能
- 微信小程序?qū)崿F(xiàn)多選框全選與反全選及購物車中刪除選中的商品功能
- 微信小程序?qū)崿F(xiàn)購物車代碼實(shí)例詳解
- 微信小程序之購物車功能
- 微信小程序購物車、父子組件傳值及calc的注意事項(xiàng)總結(jié)
- 微信小程序利用swiper+css實(shí)現(xiàn)購物車商品刪除功能
- 微信小程序?qū)崿F(xiàn)加入購物車滑動(dòng)軌跡
- 微信小程序?qū)崿F(xiàn)簡(jiǎn)單購物車小功能
相關(guān)文章
使用snowfall.jquery.js實(shí)現(xiàn)愛心滿屏飛的效果
這篇文章主要介紹了使用snowfall.jquery.js實(shí)現(xiàn)愛心滿屏飛的效果的相關(guān)資料,需要的朋友可以參考下2017-01-01原生javascript實(shí)現(xiàn)文件異步上傳的實(shí)例講解
下面小編就為大家?guī)硪黄鷍avascript實(shí)現(xiàn)文件異步上傳的實(shí)例講解。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-10-10JavaScript中cookie工具函數(shù)封裝的示例代碼
這篇文章給大家主要介紹了JavaScript中cookie工具函數(shù)的封裝,文中給出了詳細(xì)的實(shí)現(xiàn)步驟和示例代碼,相信會(huì)對(duì)大家的理解很有幫助,有需要的朋友們下面來一起看看吧。2016-10-10利用JavaScript實(shí)現(xiàn)簡(jiǎn)單全選和全不選的思路和方法
最近開始練習(xí)js的基本操作,常常因?yàn)橐恍┬∈韬鰧?dǎo)致頁面效果無法實(shí)現(xiàn),下面這篇文章主要給大家介紹了關(guān)于利用JavaScript實(shí)現(xiàn)簡(jiǎn)單全選和不全選的思路和方法,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-07-07JavaScript獲取當(dāng)前網(wǎng)頁最后修改時(shí)間的方法
這篇文章主要介紹了JavaScript獲取當(dāng)前網(wǎng)頁最后修改時(shí)間的方法,涉及javascript中document.lastModified屬性的使用技巧,需要的朋友可以參考下2015-04-04值得學(xué)習(xí)的JavaScript調(diào)試技巧分享
這篇文章主要給大家介紹了一些JavaScript調(diào)試技巧,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06JS中數(shù)組實(shí)現(xiàn)代碼(倒序遍歷數(shù)組,數(shù)組連接字符串)
這篇文章主要介紹了JS中數(shù)組實(shí)現(xiàn)代碼(倒序遍歷數(shù)組,數(shù)組連接字符串),代碼簡(jiǎn)單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-12-12讓bootstrap的carousel支持滑動(dòng)滾屏的實(shí)現(xiàn)代碼
這篇文章主要介紹了讓bootstrap的carousel支持滑動(dòng)滾屏的實(shí)現(xiàn)代碼,需要的朋友可以參考下2017-11-11