微信小程序 購(gòu)物車簡(jiǎn)單實(shí)例
微信小程序,這里實(shí)現(xiàn)購(gòu)物車功能的小demo,有需要此功能的朋友可以參考下。
摘要: 加減商品數(shù)量,匯總價(jià)格,全選與全不選
設(shè)計(jì)思路:
一、從網(wǎng)絡(luò)上傳入以下Json數(shù)據(jù)格式的數(shù)組 1.購(gòu)物車id:cid 2.標(biāo)題title 3.數(shù)量num 4.圖片地址 5.價(jià)格price 6.小計(jì) 7.是否選中selected
二、點(diǎn)擊復(fù)選框toggle操作 如已經(jīng)選中的,經(jīng)點(diǎn)擊變成未選中,反之而反之 點(diǎn)擊依據(jù)index作為標(biāo)識(shí),而不用cid,方便遍歷
三、全選操作 首次點(diǎn)擊即為全部選中,再次點(diǎn)擊為全不選,全選按鈕本身也跟隨toggle變換
四、點(diǎn)擊結(jié)算按鈕,將已選中的cid數(shù)組取出,以供通過網(wǎng)絡(luò)提交到服務(wù)端,這里給個(gè)toast作為結(jié)果演示。
五、利用stepper作加減運(yùn)算,同樣依據(jù)index作為標(biāo)識(shí),點(diǎn)完寫回num值。
六、布局,全選與結(jié)算按鈕底部對(duì)齊,購(gòu)物車商城自適應(yīng)高度,類似于Android的weight。
步驟:
初始數(shù)據(jù)渲染
1.1 布局與樣式表
上方是一個(gè)商品列表,下方是一個(gè)全選按鈕與立即結(jié)算按鈕
商品列表左部為商品縮略圖,右上為商品標(biāo)題,右下為商品價(jià)格與數(shù)量,其中商品數(shù)量使用WXStepper來實(shí)現(xiàn)加減操作
js:初始化一個(gè)數(shù)據(jù)源,這往往是從網(wǎng)絡(luò)獲取的,相關(guān)接口可參見:https://mp.weixin.qq.com/debug/wxadoc/dev/api/network-request.html
Page({
data:{
carts: [
{cid:1008,title:'Zippo打火機(jī)',image:'https://img12.360buyimg.com/n7/jfs/t2584/348/1423193442/572601/ae464607/573d5eb3N45589898.jpg',num:'1',price:'198.0',sum:'198.0',selected:true},
{cid:1012,title:'iPhone7 Plus',image:'https://img13.360buyimg.com/n7/jfs/t3235/100/1618018440/139400/44fd706e/57d11c33N5cd57490.jpg',num:'1',price:'7188.0',sum:'7188.0',selected:true},
{cid:1031,title:'得力訂書機(jī)',image:'https://img10.360buyimg.com/n7/jfs/t2005/172/380624319/93846/b51b5345/5604bc5eN956aa615.jpg',num:'3',price:'15.0',sum:'45.0',selected:false},
{cid:1054,title:'康師傅妙芙蛋糕',image:'https://img14.360buyimg.com/n7/jfs/t2614/323/914471624/300618/d60b89b6/572af106Nea021684.jpg',num:'2',price:'15.2',sum:'30.4',selected:false},
{cid:1063,title:'英雄鋼筆',image:'https://img10.360buyimg.com/n7/jfs/t1636/60/1264801432/53355/bb6a3fd1/55c180ddNbe50ad4a.jpg',num:'1',price:'122.0',sum:'122.0',selected:true},
]
}
})
布局文件
<view class="container carts-list">
<view wx:for="{{carts}}" class="carts-item" data-title="{{item.title}}" data-url="{{item.url}}" bindtap="bindViewTap">
<view>
<image class="carts-image" src="{{item.image}}" mode="aspectFill"/>
</view>
<view class="carts-text">
<text class="carts-title">{{item.title}}</text>
<view class="carts-subtitle">
<text class="carts-price">{{item.sum}}</text>
<text>WXStepper</text>
</view>
</view>
</view>
</view>
樣式表
/*外部容器*/
.container {
display: flex;
flex-direction: column;
align-items: center;
justify-content: space-between;
box-sizing: border-box;
}
/*整體列表*/
.carts-list {
display: flex;
flex-direction: column;
padding: 20rpx 40rpx;
}
/*每行單元格*/
.carts-item {
display: flex;
flex-direction: row;
height:150rpx;
/*width屬性解決標(biāo)題文字太短而縮略圖偏移*/
width:100%;
border-bottom: 1px solid #eee;
padding: 30rpx 0;
}
/*左部圖片*/
.carts-image {
width:150rpx;
height:150rpx;
}
/*右部描述*/
.carts-text {
width: 100%;
display: flex;
flex-direction: column;
justify-content: space-between;
}
/*右上部分標(biāo)題*/
.carts-title {
margin: 10rpx;
font-size: 30rpx;
}
/*右下部分價(jià)格與數(shù)量*/
.carts-subtitle {
font-size: 25rpx;
color:darkgray;
padding: 0 20rpx;
display: flex;
flex-direction: row;
justify-content:space-between;
}
/*價(jià)格*/
.carts-price {
color: #f60;
}

1.2 集成WXStepper
1.2.1 復(fù)制組件內(nèi)容
[2016-10-16]
將stepper.wxss的內(nèi)容復(fù)制到cart.wxss中
將stepper.wxml的內(nèi)容復(fù)制到cart.wxml中
與之前的單一組件不同的是:這里要定義數(shù)組minusStatuses來與每一個(gè)加減按鈕相應(yīng)。當(dāng)然,合并入carts也是沒問題的。
minusStatuses: ['disabled', 'disabled', 'normal', 'normal', 'disabled']
原來的靜態(tài)字符WXStepper換成以下的代碼
<view class="stepper">
<!-- 減號(hào) -->
<text class="{{minusStatuses[index]}}" data-index="{{index}}" bindtap="bindMinus">-</text>
<!-- 數(shù)值 -->
<input type="number" bindchange="bindManual" value="{{item.num}}" />
<!-- 加號(hào) -->
<text class="normal" data-index="{{index}}" bindtap="bindPlus">+</text>
</view>
js代碼bindMinus、bindPlus分別改造為如下:
bindMinus: function(e) {
var index = parseInt(e.currentTarget.dataset.index);
var num = this.data.carts[index].num;
// 如果只有1件了,就不允許再減了
if (num > 1) {
num --;
}
// 只有大于一件的時(shí)候,才能normal狀態(tài),否則disable狀態(tài)
var minusStatus = num <= 1 ? 'disabled' : 'normal';
// 購(gòu)物車數(shù)據(jù)
var carts = this.data.carts;
carts[index].num = num;
// 按鈕可用狀態(tài)
var minusStatuses = this.data.minusStatuses;
minusStatuses[index] = minusStatus;
// 將數(shù)值與狀態(tài)寫回
this.setData({
carts: carts,
minusStatuses: minusStatuses
});
},
bindPlus: function(e) {
var index = parseInt(e.currentTarget.dataset.index);
var num = this.data.carts[index].num;
// 自增
num ++;
// 只有大于一件的時(shí)候,才能normal狀態(tài),否則disable狀態(tài)
var minusStatus = num <= 1 ? 'disabled' : 'normal';
// 購(gòu)物車數(shù)據(jù)
var carts = this.data.carts;
carts[index].num = num;
// 按鈕可用狀態(tài)
var minusStatuses = this.data.minusStatuses;
minusStatuses[index] = minusStatus;
// 將數(shù)值與狀態(tài)寫回
this.setData({
carts: carts,
minusStatuses: minusStatuses
});
},
效果如圖:

[2016-10-17]
修正手工改動(dòng)數(shù)量保存到數(shù)組
1.3 集成LXCheckboxGroup
復(fù)制布局文件代碼到wxml,這里需要判斷一下已選狀態(tài),一般購(gòu)物車勾選狀態(tài)是記錄在網(wǎng)絡(luò)的。
index值用于傳值js,遍歷之用。
<!-- 復(fù)選框圖標(biāo) -->
<icon wx:if="{{item.selected}}" type="success_circle" size="20" bindtap="bindCheckbox" data-index="{{index}}"/>
<icon wx:else type="circle" size="20" bindtap="bindCheckbox" data-index="{{index}}"/>
復(fù)選框居中
/*復(fù)選框樣式*/
.carts-list icon {
margin-top: 60rpx;
margin-right: 20rpx;
}
綁定點(diǎn)擊復(fù)選框事件,對(duì)選擇狀態(tài)做反選操作。
bindCheckbox: function(e) {
/*綁定點(diǎn)擊事件,將checkbox樣式改變?yōu)檫x中與非選中*/
//拿到下標(biāo)值,以在carts作遍歷指示用
var index = parseInt(e.currentTarget.dataset.index);
//原始的icon狀態(tài)
var selected = this.data.carts[index].selected;
var carts = this.data.carts;
// 對(duì)勾選狀態(tài)取反
carts[index].selected = !selected;
// 寫回經(jīng)點(diǎn)擊修改后的數(shù)組
this.setData({
carts: carts
});
}
效果圖:

1.4 加入全選與立即結(jié)算按鈕
1.4.1 修改布局文件,實(shí)現(xiàn)上述按鈕底部對(duì)齊,使用flex與固定高度來完成。
減少為3行,看是否還在最底;此外,還要保證懸浮在底部,不被列表項(xiàng)的滾動(dòng)而滾動(dòng)。
<view class="carts-footer">
<view bindtap="bindSelectAll">
<icon wx:if="{{selectedAllStatus}}" type="success_circle" size="20"/>
<icon wx:else type="circle" size="20" />
<text>全選</text>
</view>
<view class="button">立即結(jié)算</view>
</view>
之前用<button>立即結(jié)算</button>來實(shí)現(xiàn),發(fā)現(xiàn)無論如何都不能實(shí)現(xiàn)全選部件與結(jié)算按鈕分散對(duì)齊,不響應(yīng)如下樣式
display: flex; flex-direction: row; justify-content: space-between;
樣式表
/*底部按鈕*/
.carts-footer {
width: 100%;
height: 80rpx;
display: flex;
flex-direction: row;
justify-content: space-between;
}
/*復(fù)選框*/
.carts-footer icon {
margin-left: 20rpx;
}
/*全選字樣*/
.carts-footer text {
font-size: 30rpx;
margin-left: 8rpx;
line-height: 10rpx;
}
/*立即結(jié)算按鈕*/
.carts-footer .button {
line-height: 80rpx;
text-align: center;
width:220rpx;
height: 80rpx;
background-color: #f60;
color: white;
font-size: 36rpx;
border-radius: 0;
border: 0;
}
1.4.2 全選與全不選事件
實(shí)現(xiàn)bindSelectAll事件,改變?nèi)x狀態(tài)
首先定義一個(gè)data值,以記錄全選狀態(tài)
selectedAllStatus: false
事件實(shí)現(xiàn):
bindSelectAll: function() {
// 環(huán)境中目前已選狀態(tài)
var selectedAllStatus = this.data.selectedAllStatus;
// 取反操作
selectedAllStatus = !selectedAllStatus;
// 購(gòu)物車數(shù)據(jù),關(guān)鍵是處理selected值
var carts = this.data.carts;
// 遍歷
for (var i = 0; i < carts.length; i++) {
carts[i].selected = selectedAllStatus;
}
this.setData({
selectedAllStatus: selectedAllStatus,
carts: carts
});
}

1.4.3 立即結(jié)算顯示目前所選的cid,以供提交到網(wǎng)絡(luò),商品數(shù)量應(yīng)該是包括在cid中的,后端設(shè)計(jì)應(yīng)該只關(guān)注cid與uid
布局文件也埋一下toast,js只要改變toast的顯示與否即可。
<toast hidden="{{toastHidden}}" bindchange="bindToastChange">
{{toastStr}}
</toast>
為立即結(jié)算綁定事件bindCheckout,彈出cid彈窗
bindCheckout: function() {
// 初始化toastStr字符串
var toastStr = 'cid:';
// 遍歷取出已勾選的cid
for (var i = 0; i < this.data.carts.length; i++) {
if (this.data.carts[i].selected) {
toastStr += this.data.carts[i].cid;
toastStr += ' ';
}
}
//存回data
this.setData({
toastHidden: false,
toastStr: toastStr
});
},
bindToastChange: function() {
this.setData({
toastHidden: true
});
}
1.5 底部懸浮固定
1.5.1 商品列表 .carts-list 加入 margin-bottom: 80rpx; 以及修改上邊距為零,使得底部部件與分隔不重復(fù)出現(xiàn),padding: 0 40rpx;
1.5.2 底部按鈕 .carts-footer 加入 background: white;
1.5.3 .carts-footer 加入
position: fixed; bottom: 0; border-top: 1px solid #eee;

1.6 匯總
1.6.1 首先定義一個(gè)數(shù)據(jù)源,并在布局文件中埋坑
total: ''
<text>{{total}}</text>
1.6.2 通用匯總函數(shù)
sum: function() {
var carts = this.data.carts;
// 計(jì)算總金額
var total = 0;
for (var i = 0; i < carts.length; i++) {
if (carts[i].selected) {
total += carts[i].num * carts[i].price;
}
}
// 寫回經(jīng)點(diǎn)擊修改后的數(shù)組
this.setData({
carts: carts,
total: '¥' + total
});
}
然后分別在bindMinus bindPlus bindCheckbox bindSelectAll onLoad中調(diào)用this.sum()
如圖:

感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
- 微信小程序?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é)
- 微信小程序?qū)崿F(xiàn)簡(jiǎn)單購(gòu)物車功能
- 微信小程序利用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)文章
JS算法題解數(shù)組刪除重復(fù)項(xiàng)方法示例
這篇文章主要為大家介紹了JS算法題解數(shù)組刪除重復(fù)項(xiàng)方法示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07
ant-design的upload組件中實(shí)現(xiàn)粘貼上傳實(shí)例詳解
這篇文章主要為大家介紹了ant-design的upload組件中實(shí)現(xiàn)粘貼上傳實(shí)例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05
四十九個(gè)javascript小知識(shí)實(shí)用技巧
這篇文章主要給大家分享得是四十九個(gè)javascript小知識(shí)實(shí)用技巧像下面文章圍繞JavaScript得各種技巧詳細(xì)介紹,需要的朋友可以參考一下,希望對(duì)你有所幫助2021-11-11
一文詳解cornerstone?Tools?基礎(chǔ)概念
這篇文章主要為大家介紹了cornerstone?Tools?基礎(chǔ)概念詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03
微信小程序技巧之show內(nèi)容展示,上傳文件編碼問題
這篇文章主要介紹了微信小程序技巧之show內(nèi)容展示,上傳文件編碼問題,具有一定的參考價(jià)值,有興趣的可以了解一下。2017-01-01

