微信小程序?qū)崿F(xiàn)簡(jiǎn)單購(gòu)物車功能
這個(gè)微信小程序的購(gòu)物車功能,通過(guò)參照各大電商平臺(tái)的功能和界面,然后總結(jié)出來(lái)的。
效果圖

功能描述
1、可單選,全選/取消全選
2、增加、減少、手動(dòng)編輯商品的數(shù)量
3、根據(jù)商品的數(shù)量統(tǒng)計(jì)價(jià)格
代碼實(shí)現(xiàn)
此處省略一萬(wàn)字,廢話不多說(shuō),直接上代碼吧!
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)多,就不放上來(lái)啦,需要的可以留下你的郵箱地址哦
JS:
當(dāng)頁(yè)面剛加載進(jìn)來(lái),當(dāng)然要先onShow一下,默認(rèn)全選,統(tǒng)計(jì)購(gòu)物車?yán)锼猩唐返膬r(jià)格。PS:這里建議用onShow,因?yàn)槊看芜M(jìn)入購(gòu)物車都需要重新加載數(shù)據(jù),而onLoad和onReady只在初始化的時(shí)候執(zhí)行一次。
onShow() {
this.getTotalPrice();
}
統(tǒng)計(jì)總價(jià)(該頁(yè)面還有其它地方需要調(diào)用到這個(gè)方法)
// 統(tǒng)計(jì)總價(jià)
getTotalPrice() {
// 獲取購(gòu)物車列表
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à)格加起來(lái)
total += dataArr[i].num * dataArr[i].price;
}
}
// 賦值到data中渲染到頁(yè)面
this.setData({
dataArr: dataArr,
totalPrice: total.toFixed(2)
});
}
選擇商品(單選),通過(guò) data-index="{{index}}" 把當(dāng)前商品在列表數(shù)組中的下標(biāo)傳給事件,在更改單個(gè)商品的狀態(tài)時(shí),也要注意全選的狀態(tài),還有重新統(tǒng)計(jì)總價(jià)。
// 選擇事件
selectList(e) {
// 獲取data- 傳進(jìn)來(lái)的index
let index = e.currentTarget.dataset.index;
// 獲取購(gòu)物車列表
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é)算頁(yè)面
// 去結(jié)算
toOrder() {
// 處理數(shù)據(jù)
// *****
// Author: Moss
// QQ: 827291427
// *****
// 跳轉(zhuǎn)結(jié)算頁(yè)面
wx.navigateTo({
url: '/pages/shop/order/order'
})
}
雖然,購(gòu)物車的功能沒(méi)有太難,但是涉及到的微信小程序的知識(shí)點(diǎn)還是挺多的,可以從中學(xué)習(xí)并掌握!
希望能幫到瀏覽這篇文章的你,當(dāng)然更希望你能在閱讀之后自己能寫出來(lái),而不是復(fù)制粘貼來(lái)敷衍任務(wù)。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 微信小程序 購(gòu)物車簡(jiǎn)單實(shí)例
- 微信小程序?qū)崙?zhàn)篇之購(gòu)物車的實(shí)現(xiàn)代碼示例
- 微信小程序?qū)崿F(xiàn)購(gòu)物車功能
- 微信小程序?qū)崿F(xiàn)多選框全選與反全選及購(gòu)物車中刪除選中的商品功能
- 微信小程序?qū)崿F(xiàn)購(gòu)物車代碼實(shí)例詳解
- 微信小程序之購(gòu)物車功能
- 微信小程序購(gòu)物車、父子組件傳值及calc的注意事項(xiàng)總結(jié)
- 微信小程序利用swiper+css實(shí)現(xiàn)購(gòu)物車商品刪除功能
- 微信小程序?qū)崿F(xiàn)加入購(gòu)物車滑動(dòng)軌跡
- 微信小程序?qū)崿F(xiàn)簡(jiǎn)單購(gòu)物車小功能
相關(guān)文章
JavaScript原生對(duì)象常用方法總結(jié)(推薦)
下面小編就為大家?guī)?lái)一篇JavaScript原生對(duì)象常用方法總結(jié)(推薦)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-05-05
JS中的算法與數(shù)據(jù)結(jié)構(gòu)之常見(jiàn)排序(Sort)算法詳解
這篇文章主要介紹了JS中的算法與數(shù)據(jù)結(jié)構(gòu)之常見(jiàn)排序(Sort)算法,結(jié)合實(shí)例形式詳細(xì)分析了js常見(jiàn)排序算法中的冒泡排序、選擇排序、插入排序、希爾排序、歸并排序、快速排序等算法相關(guān)實(shí)現(xiàn)技巧與操作注意事項(xiàng),需要的朋友可以參考下2019-08-08
詳解js的事件處理函數(shù)和動(dòng)態(tài)創(chuàng)建html標(biāo)記方法
本文主要對(duì)javascript的事件處理函數(shù),動(dòng)態(tài)創(chuàng)建html標(biāo)記的兩種方法進(jìn)行詳細(xì)介紹,具有很好的參考價(jià)值,需要的朋友一起來(lái)看下吧2016-12-12
BootStrap 智能表單實(shí)戰(zhàn)系列(十)自動(dòng)完成組件的支持
這篇文章主要介紹了BootStrap 智能表單實(shí)戰(zhàn)系列(十)自動(dòng)完成組件的支持 的相關(guān)資料,需要的朋友可以參考下2016-06-06
js學(xué)習(xí)總結(jié)之DOM2兼容處理重復(fù)問(wèn)題的解決方法
這篇文章主要為大家詳細(xì)介紹了js學(xué)習(xí)總結(jié)之DOM2兼容處理重復(fù)問(wèn)題的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07
15位和18位身份證JS校驗(yàn)的簡(jiǎn)單實(shí)例
下面小編就為大家?guī)?lái)一篇15位和18位身份證JS校驗(yàn)的簡(jiǎn)單實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-07-07
微信小程序?qū)崿F(xiàn)可拖動(dòng)懸浮圖標(biāo)的示例代碼
這篇文章主要介紹了微信小程序?qū)崿F(xiàn)可拖動(dòng)懸浮圖標(biāo)的示例代碼,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2023-12-12
Express與NodeJs創(chuàng)建服務(wù)器的兩種方法
本文主要介紹了NodeJs創(chuàng)建Web服務(wù)器;Express創(chuàng)建Web服務(wù)器的兩種方法,具有一定的參考價(jià)值,下面跟著小編一起來(lái)看下吧2017-02-02

