給大家分享一下自己寫的一個餓了么小程序的購物車功能
下邊是wxml:
<view class="box"> <view class="header"> <view class="top"> <view class="left"> <image src="https://z3.ax1x.com/2021/06/02/2Qlpfs.jpg"></image> </view> <view class="right"> <image src="https://z3.ax1x.com/2021/06/02/2QlPlq.jpg"></image> 關注 </view> </view> <view class="botm"> <image src="https://z3.ax1x.com/2021/06/02/2QlCpn.jpg"></image> </view> </view> <view class="section"> <view class="sec1"> <view>點餐</view> <view>評價<text>4.8</text></view> <view>商家<text>故事</text></view> </view> <view class="sec2"> <view class="left"> <view class="dan" wx:for="{{left}}" wx:key="key"> {{item}} </view> </view> <view class="right"> <view class="dan" wx:for="{{right}}" wx:key="key"> <view class="rig_left"> <image src="{{item.img_url}}"></image> </view> <view class="rig_rig"> <view class="title">{{item.title}}</view> <view class="yuanl">{{item.yuanl}}</view> <view class="yuex">月售:{{item.yuex}}</view> <view class="botm"> <view class="jiag"> {{item.qian}} {{item.jiage}} </view> <view class="jiajian"> <text class="jian" bindtap="jian" data-id="{{item.id}}" hidden="{{item.flag}}">-</text> <text class="num" hidden="{{item.flag}}" >{{item.num}}</text> <text class="jia" bindtap="jia" data-id="{{item.id}}">+</text> </view> </view> </view> </view> </view> </view> </view> <view class="footer"> <view class="left"> <view bindtap="btn"> <image hidden="{{img_flag}}" src="https://z3.ax1x.com/2021/06/02/2QlSYj.jpg"></image> <image hidden="{{!img_flag}}" src="https://z3.ax1x.com/2021/06/02/2QQXm8.jpg"></image> </view> <view class="zongs" hidden="{{!img_flag}}">{{zongshu}}</view> <view class="rig"> <view class="zongj"> ¥ <text>{{zongjia}}</text> </view> <view>免配送費</view> </view> </view> <view class="{{zongjia >= 20 ? 'lan' : 'hui'}}" bindtap="jiesuan"></view> </view> <view class="gwc" hidden="{{show}}"> <view class="top" bindtap="btn"></view> <view class="btm"> <view class="dan" wx:for="{{arr}}" wx:key="key"> <view class="rig_left"> <image src="{{item.img_url}}"></image> </view> <view class="rig_rig"> <view class="title">{{item.title}}</view> <view class="botm"> <view class="jiag"> {{item.qian}} {{item.jiage}} </view> <view class="jiajian"> <text class="jian" bindtap="jian" data-id="{{item.id}}" >-</text> <text class="num" >{{item.num}}</text> <text class="jia" bindtap="jia" data-id="{{item.id}}">+</text> </view> </view> </view> </view> </view> </view> </view>
下邊是wxss:
1 .box{ 2 width: 100%; 3 } 4 .header{ 5 width: 100%; 6 background-image: url(https://z3.ax1x.com/2021/06/02/2QQj0S.jpg); 7 background-size: 100% 100%; 8 position: relative; 9 } 10 .header .top{ 11 width: 100%; 12 height: 250rpx; 13 position: fixed; 14 top: 0; 15 padding-top: 60rpx; 16 display: flex; 17 justify-content: space-between; 18 z-index: 3; 19 } 20 .header .top .left{ 21 padding-left: 40rpx; 22 } 23 .header .top .left image{ 24 width: 24rpx; 25 height: 36rpx; 26 } 27 .header .top .right{ 28 padding-right: 200rpx; 29 color: white; 30 font-size: 30rpx; 31 } 32 .header .top .right image{ 33 width: 36rpx; 34 height: 36rpx; 35 } 36 .header .botm{ 37 width: 88%; 38 height: 230rpx; 39 padding: 1%; 40 border-radius: 20rpx; 41 overflow: hidden; 42 background: white; 43 position: relative; 44 top: 150rpx; 45 left: 5%; 46 box-shadow: 0 0 15rpx gainsboro; 47 } 48 .header .botm image{ 49 width: 100%; 50 height: 100%; 51 } 52 .section{ 53 width: 100%; 54 padding-top: 110rpx; 55 margin-bottom: 200rpx; 56 margin-top: 60rpx; 57 overflow: auto; 58 } 59 .section .sec1{ 60 width: 100%; 61 display: flex; 62 } 63 .section .sec1 view{ 64 font-size: 30rpx; 65 font-weight: bold; 66 margin-left: 20rpx; 67 } 68 .section .sec1 view text{ 69 font-size: 20rpx; 70 font-weight: 100; 71 position: absolute; 72 } 73 .section .sec1 view:nth-child(n+2){ 74 margin-left: 50rpx; 75 } 76 .section .sec1 view:nth-child(1){ 77 border-bottom: 4rpx solid #02B7FC; 78 } 79 .section .sec2{ 80 width: 95%; 81 display: flex; 82 } 83 .section .sec2 .left{ 84 width: 150rpx; 85 height: 100%; 86 background: #F2F2F2; 87 } 88 .section .sec2 .left .dan{ 89 width: 110rpx; 90 padding: 25rpx 30rpx 15rpx 15rpx; 91 font-size: 24rpx; 92 } 93 .section .sec2 .left .dan:nth-child(1){ 94 background: white; 95 } 96 .section .sec2 .right{ 97 width: 100%; 98 padding-left: 15rpx; 99 } 100 .section .sec2 .right .dan{ 101 width: 100%; 102 padding-top: 15rpx; 103 display: flex; 104 } 105 .section .sec2 .right .dan .rig_left{ 106 width: 250rpx; 107 height: 180rpx; 108 border-radius: 15rpx; 109 overflow: hidden; 110 } 111 .section .sec2 .right .dan .rig_left image{ 112 width: 100%; 113 height: 100%; 114 } 115 .section .sec2 .right .dan .rig_rig{ 116 width: 100%; 117 padding-left: 15rpx; 118 } 119 .section .sec2 .right .dan .rig_rig .title{ 120 font-size: 30rpx; 121 font-weight: bold; 122 } 123 .section .sec2 .right .dan .rig_rig .yuanl{ 124 font-size: 20rpx; 125 } 126 .section .sec2 .right .dan:nth-child(1) .rig_rig .yuanl{ 127 color: #BE874E; 128 } 129 .section .sec2 .right .dan:nth-child(3) .rig_rig .yuanl{ 130 color: #BE874E; 131 } 132 .section .sec2 .right .dan .rig_rig .yuex{ 133 font-size: 20rpx; 134 color: #999999; 135 } 136 .section .sec2 .right .dan .rig_rig .botm{ 137 width: 100%; 138 display: flex; 139 justify-content: space-between; 140 padding-top: 40rpx; 141 } 142 .section .sec2 .right .dan .rig_rig .botm .jiag{ 143 color: red; 144 } 145 .section .sec2 .right .dan .rig_rig .botm .jiajian .jian{ 146 padding: 0 18rpx; 147 text-align: center; 148 border-radius: 50%; 149 border: 2rpx solid #02B7FC; 150 color: #02B7FC; 151 font-size: 40rpx; 152 } 153 .section .sec2 .right .dan .rig_rig .botm .jiajian .jia{ 154 font-size: 40rpx; 155 padding: 0 12rpx; 156 text-align: center; 157 border-radius: 50%; 158 background: #02B7FC; 159 color: white; 160 } 161 .section .sec2 .right .dan .rig_rig .botm .jiajian .num{ 162 padding: 0 15rpx; 163 } 164 .footer{ 165 width: 90%; 166 height: 100rpx; 167 padding: 20rpx 5%; 168 position: fixed; 169 bottom: 0; 170 background: white; 171 display: flex; 172 justify-content: space-between; 173 } 174 .footer .left{ 175 display: flex; 176 } 177 .footer .left image{ 178 width: 120rpx; 179 height: 70rpx; 180 } 181 .hui::before{ 182 display: block; 183 width: 200rpx; 184 height: 60rpx; 185 text-align: center; 186 line-height: 60rpx; 187 border-radius: 30rpx; 188 color: white; 189 background: #999999; 190 content: "¥20起送"; 191 } 192 .lan::before{ 193 display: block; 194 width: 200rpx; 195 height: 60rpx; 196 text-align: center; 197 line-height: 60rpx; 198 border-radius: 30rpx; 199 color: white; 200 content: "去結算"; 201 background: #02B7FC; 202 } 203 .zongs{ 204 width: 30rpx; 205 height: 30rpx; 206 border-radius: 50%; 207 background: red; 208 color: white; 209 font-size: 25rpx; 210 text-align: center; 211 line-height: 30rpx; 212 position: absolute; 213 top: 31rpx; 214 left: 120rpx; 215 } 216 .footer .left .rig .zongj{ 217 font-size: 20rpx; 218 } 219 .footer .left .rig .zongj text{ 220 font-size: 40rpx; 221 } 222 .footer .left .rig view:nth-child(2){ 223 font-size: 20rpx; 224 } 225 page{ 226 width: 100%; 227 height: 100%; 228 /* overflow: hidden; */ 229 } 230 .gwc{ 231 position: fixed; 232 top: 0; 233 width: 100%; 234 height: 90%; 235 z-index: 2; 236 } 237 .gwc .top{ 238 width: 100%; 239 height: 100%; 240 background: rgba(0, 0, 0,0.5); 241 } 242 .gwc .btm{ 243 width: 100%; 244 height: 40%; 245 overflow: auto; 246 position: absolute; 247 bottom: 0; 248 background: white; 249 z-index: 3; 250 } 251 252 .gwc .btm .dan{ 253 width: 100%; 254 padding-top: 15rpx; 255 display: flex; 256 } 257 .gwc .btm .dan .rig_left{ 258 width: 250rpx; 259 height: 180rpx; 260 border-radius: 15rpx; 261 overflow: hidden; 262 } 263 .gwc .btm .dan .rig_left image{ 264 width: 100%; 265 height: 100%; 266 } 267 .gwc .dan .rig_rig{ 268 width: 100%; 269 padding-left: 15rpx; 270 } 271 .gwc .dan .rig_rig .title{ 272 font-size: 30rpx; 273 font-weight: bold; 274 } 275 .gwc .dan .rig_rig .botm{ 276 width: 90%; 277 display: flex; 278 justify-content: space-between; 279 padding-top: 60rpx; 280 } 281 .gwc .dan .rig_rig .botm .jiag{ 282 color: red; 283 } 284 .gwc .dan:nth-child(1) .rig_rig .botm .jiajian{ 285 display: block; 286 } 287 .gwc .dan .rig_rig .botm .jiajian .jian{ 288 padding: 0 18rpx; 289 text-align: center; 290 border-radius: 50%; 291 border: 2rpx solid #02B7FC; 292 color: #02B7FC; 293 font-size: 40rpx; 294 } 295 .gwc .dan .rig_rig .botm .jiajian .jia{ 296 font-size: 40rpx; 297 padding: 0 12rpx; 298 text-align: center; 299 border-radius: 50%; 300 background: #02B7FC; 301 color: white; 302 } 303 .gwc .dan .rig_rig .botm .jiajian .num{ 304 padding: 0 15rpx; 305 }
下邊是js功能代碼:
1 // pages/sjia/sjia.js 2 Page({ 3 4 /** 5 * 頁面的初始數據 6 */ 7 data: { 8 left:["熱銷","福利回饋特惠","滿減主食","折扣單品","滿減小食","套餐人氣精選","套餐超值品質","滿減飲料","流量專享"], 9 right:[ 10 { 11 img_url:"https://z3.ax1x.com/2021/06/02/2QQj0S.jpg", 12 title:"至尊板燒堡", 13 yuanl:"鄭州板燒堡人氣飆升至第2名", 14 yuex:"13", 15 qian:"¥", 16 jiage:13.9, 17 id:0, 18 num:0, 19 flag:true, 20 danz:0 21 }, 22 { 23 img_url:"https://z3.ax1x.com/2021/06/02/2QQj0S.jpg", 24 title:"香辣雙雞堡", 25 yuanl:"原料:雞肉", 26 yuex:"13", 27 qian:"¥", 28 jiage:13.9, 29 id:1, 30 num:0, 31 flag:true, 32 danz:0 33 }, 34 { 35 img_url:"https://z3.ax1x.com/2021/06/02/2QQj0S.jpg", 36 title:"香辣雞腿堡", 37 yuanl:"漢堡品類優先商品", 38 yuex:"13", 39 qian:"¥", 40 jiage:13.9, 41 id:2, 42 num:0, 43 flag:true, 44 danz:0 45 }, 46 { 47 img_url:"https://z3.ax1x.com/2021/06/02/2QQj0S.jpg", 48 title:"至尊板燒堡", 49 yuanl:"原料:鱈魚", 50 yuex:"13", 51 qian:"¥", 52 jiage:13.9, 53 id:3, 54 num:0, 55 flag:true, 56 danz:0 57 }, 58 { 59 img_url:"https://z3.ax1x.com/2021/06/02/2QQj0S.jpg", 60 title:"香辣雞肉堡 ,。", 61 yuanl:"原料:鱈魚", 62 yuex:"13", 63 qian:"¥", 64 jiage:13.9, 65 id:4, 66 num:0, 67 flag:true, 68 danz:0 69 } 70 ], 71 img_flag:false, 72 zongshu:0, 73 zongjia:0, 74 show:true, 75 arr:[] 76 }, 77 jia(e){ 78 var that = this; 79 var index = e.currentTarget.dataset.id; //獲取商品自定義id 80 var num = that.data.right[index].num; //通過自定義id獲取當前點擊元素的數量 81 var numprop = "right["+index+"].num"; //通過字符串拼接的形式來拿取當前商品的數量用於下邊進行更改 82 var img_flag = that.data.img_flag; 83 var flagprop = "right["+index+"].flag"; 84 var arr = that.data.arr; //用於接收加入購物車中的數據 85 var arr_id = ""; //通過點擊時拿到的id進行判斷是否加入購物車 86 var danzprop = "right["+index+"].danz"; //單個總價 87 88 //計算單個商品加的數量 注意:最開始計算完單個數量時必須要把值先更新,下邊才能繼續寫 89 num += 1; 90 that.setData({ 91 [numprop]:num 92 }) 93 94 //計算單個商品的總價,用於下一個確認訂單頁面 95 that.data.right[index].danz=that.data.right[index].num*that.data.right[index].jiage; 96 that.setData({ 97 [danzprop]:that.data.right[index].danz 98 }) 99 100 //加入購物車 101 if (that.data.zongshu == 0) { 102 arr.push(that.data.right[index]); //當點擊加入 總數為0時 加入第一個購物車 103 } 104 for(let j=0;j<that.data.arr.length;j++){ 105 arr_id += String(arr[j].id) //遍歷購物車中商品 並添加id到數組用於添加判斷 106 } 107 if (arr_id.indexOf(String(index)) == -1) { 108 arr.push(that.data.right[index]); //再次點擊時判斷購物車中是否有這件商品 沒有時添加 109 } 110 that.setData({ 111 arr:arr 112 }) 113 114 if (num >= 1) { 115 that.setData({ //當商品總數大於等於1時,讓減號跟數量顯示 116 [flagprop]:false 117 }) 118 } 119 //計算總價錢跟總數量 120 var zshu = null; 121 var zjia = null; 122 for(let i=0;i < that.data.right.length;i++){ 123 zshu += that.data.right[i].num; 124 zjia += that.data.right[i].num*that.data.right[i].jiage; 125 } 126 that.setData({ 127 zongshu:zshu, 128 zongjia:zjia+2 129 }) 130 // console.log(that.data.zongjia); 131 if (that.data.zongshu >= 1) { //購物車的顯示隱藏 132 that.setData({ 133 img_flag:true 134 }) 135 } 136 }, 137 jian(e){ 138 var that = this; 139 var index = e.currentTarget.dataset.id; 140 var num = that.data.right[index].num; 141 var numprop = "right["+index+"].num" 142 var img_flag = that.data.img_flag; 143 var flagprop = "right["+index+"].flag"; 144 var arr = that.data.arr; 145 //單商品數量加減 146 num -= 1; 147 that.setData({ 148 [numprop]:num 149 }) 150 //當商品數量為0時將這個商品從購物車中刪除 151 for(let j=0;j<arr.length;j++){ 152 if (arr[j].num == 0) { 153 arr.splice(j,1); 154 } 155 } 156 that.setData({ 157 arr:arr 158 }) 159 160 if (num < 1) { //當單個商品數量小於1時讓數量跟減號隱藏 161 that.setData({ 162 [flagprop]:true 163 }) 164 } 165 //計算總價跟總數 166 var zshu = null; 167 var zjia = null; 168 for(let i=0;i < that.data.right.length;i++){ 169 zshu += that.data.right[i].num; 170 zjia += that.data.right[i].num*that.data.right[i].jiage; 171 } 172 that.setData({ 173 zongshu:zshu, 174 zongjia:zjia 175 }) 176 // console.log(that.data.zongshu); 177 if (that.data.zongshu < 1) { 178 that.setData({ 179 img_flag:false 180 }) 181 } 182 }, 183 184 btn(){ //購物車的顯示隱藏 185 var that = this; 186 that.setData({ 187 show:!that.data.show 188 }) 189 }, 190 jiesuan(){ 191 var that = this; 192 if (that.data.zongjia >= 20) { //當總價大於等於20才能購買配送 193 wx.navigateTo({ 194 url: '../../pages/qrdd/qrdd' 195 }) 196 } 197 }, 198 /** 199 * 生命周期函數--監聽頁面加載 200 */ 201 onLoad: function (options) { 202 203 }, 204 205 /** 206 * 生命周期函數--監聽頁面初次渲染完成 207 */ 208 onReady: function () { 209 210 }, 211 212 /** 213 * 生命周期函數--監聽頁面顯示 214 */ 215 onShow: function () { 216 217 }, 218 219 /** 220 * 生命周期函數--監聽頁面隱藏 221 */ 222 onHide: function () { 223 224 }, 225 226 /** 227 * 生命周期函數--監聽頁面卸載 228 */ 229 onUnload: function () { 230 231 }, 232 233 /** 234 * 頁面相關事件處理函數--監聽用戶下拉動作 235 */ 236 onPullDownRefresh: function () { 237 238 }, 239 240 /** 241 * 頁面上拉觸底事件的處理函數 242 */ 243 onReachBottom: function () { 244 245 }, 246 247 /** 248 * 用戶點擊右上角分享 249 */ 250 onShareAppMessage: function () { 251 252 } 253 })