vant實(shí)現(xiàn)購(gòu)物車功能
做一些電商或者支付頁面,肯定少不了購(gòu)物車功能,一方面正反選,另一方面動(dòng)態(tài)價(jià)格,全選之后再去加減商品數(shù)量(這里必須考慮 里面有很多蛋疼的問題)猛的一想,感覺思路很清晰,但是,真正動(dòng)起手來就各種bug出來了,說實(shí)話 搞這個(gè)購(gòu)物車,浪費(fèi)我整整一下午的時(shí)間,當(dāng)我回過頭捋一遍,其實(shí),半小時(shí)就能完事。就是因?yàn)槿x的時(shí)候 我又去更改商品數(shù)量,然后調(diào)用算價(jià)格的方法導(dǎo)致浪費(fèi)了太多時(shí)間,話不多少,還是先上圖吧
先看看需求文檔吧
代碼格式不是很整齊 編輯器沒有調(diào)整 湊合看吧
<template> <div class="pddingTop"> <van-nav-bar title='購(gòu)物車' left-text="" fixed></van-nav-bar> <div class="shopContent"> <ul> <li v-for="(item,i) in dataList" :key="i" > <div class="shopmain"> <van-checkbox v-model="item.checked" @change="signchecked(item)"></van-checkbox> <div class="shops" @click="todetails(item.productCode)"> <div class="shopImg"><img :src="item.productUrl" alt=""></div> <div class="shopsright"> <h4>{{item.productName}}</h4> <div class="shoprightbot"> <span>¥{{item.price}}</span> <div class="shopradd"> <button @click.stop="reducebuyNum(item.buyNum,item,item.productCode,i)">-</button> <van-field style="width:40px;text-align: center" readonly v-model="item.buyNum" type="number" /> <button id="button" @click.stop="addbuyNum(item.buyNum,item)">+</button> </div> </div> </div> </div> </div> </li> </ul> </div> <div v-show="!dataList.length" class="shopping"> <div><img src="./images/shopping.png" alt=""></div> <p>暫無商品</p> </div> <div> <van-submit-bar :price="total*100" button-text="提交訂單" @submit="onSubmit" > <van-checkbox v-model="ischecked" disabled="disabled" @click="checkAll">全選</van-checkbox> </van-submit-bar> </div> </div> </template> <script> //toast 我全局引用了 import {Checkbox, SubmitBar,Card ,Field,Cell,Dialog, Toast } from 'vant'; import utils from '../utils/utils' //這里是自己封裝的方法 獲取 export default { components:{ [SubmitBar.name]:SubmitBar, [Checkbox.name]:Checkbox, [Card.name]:Card, [Field.name]:Field, [Cell.name]:Cell, }, data(){ return{ img:require("./images/gouwuche.png"), ischecked:false, dataList:[], total:0, disabled:false, } }, methods:{ todetails(productCode){ this.$router.push('/commodityDetails?productCode='+productCode) }, //商品加加 addbuyNum(num,value){ if(value.buyNum<=98){ value.buyNum++ this.shopNumber(value) this.amount(value) } }, //商品減減 reducebuyNum(num,value,productCode,i){ if(value.buyNum<=1){ Dialog.confirm({ title: '溫馨提示', message: '是否刪除商品' }).then(() => { this.https('后臺(tái)接口',{productCode:productCode}) .then(data=>{ Toast({ message:'刪除成功', duration:800 }) }) setTimeout(()=>{ //這里千萬不能再調(diào)用 要把這個(gè)數(shù)組里面去除掉 不然問題是很多 this.dataList.splice(i,1) this.amount(value) },1000) }).catch(() => { }); }else{ value.buyNum-- this.shopNumber(value) this.amount(value) } }, // 提交訂單 onSubmit(){ let cartIdList = [] this.dataList.forEach(element => { if (element.checked) { cartIdList.push(String(element.dataId)) } }); if (cartIdList.length<1) { Toast.fail('請(qǐng)選擇訂單'); } else { utils.putlocal('cartIdList',JSON.stringify(cartIdList)) this.$router.push('/placeorder'); } }, //加減 這里之前是自己手寫了 但是參考別的網(wǎng)站后 這里是通過接口加減的 shopNumber(value){ let data = { dataId :value.dataId, buyNum:value.buyNum, productCode:value.productCode } this.https('后臺(tái)接口',data) .then(data=>{ }) }, // 單選 signchecked(val){ this.amount(val) }, amount(val){ let arr =[] let MoneyList=[] this.dataList.forEach(item=>{ if(item.checked===true){ MoneyList.push(item) arr.push(item.checked) } }) //這里就是判斷時(shí)候?yàn)槿x if(arr.length===this.dataList.length){ this.ischecked = true }else{ this.ischecked = false } //價(jià)格要置為0 不然一直會(huì)累加的 也會(huì)又很大的問題 this.total=0; for(var i=0;i<MoneyList.length;i++){ this.total+=MoneyList[i].price*MoneyList[i].buyNum } }, // 全選 這里的事件有兩中 一個(gè)是click 一個(gè)是change 不同的事件用不同的方法 checkAll(){ this.dataList.forEach(item=>{ if(this.ischecked==false){ item.checked=true }else{ item.checked=false } }) }, // 列表 shoppingCartlist () { this.https('后臺(tái)接口',{}) .then(data=>{ if(data.code=='success'){ //這里需要手動(dòng)添加默認(rèn)的checked 后臺(tái)沒有返 data.data.forEach(element => { element.checked = false element.num = null }); this.dataList = data.data if(!this.dataList.length){ this.disabled=true } }else { Toast.fail(data.message); } }) } }, mounted () { this.shoppingCartlist () } } </script> <style lang="less" scoped> .van-submit-bar{ bottom:49px; padding-left:20px; } .shopContent{ margin-top:18px; padding-bottom:90px; } .shopping{ text-align: center; padding-top:99px; img{ width:96px;height:96px; margin-bottom: 25px; } } li{ padding:0 15px; background:#ffffff; margin-bottom:10px; position: relative; height:103px; .shopmain{ display: flex; padding:10px 8px 10px 10px; position: relative; .shops{ display: flex; .shopImg{ width:103px;height:83px; margin:0 7px 0 11px; img{ width:100%;height:100%; } } .shopsright{ width:185px; display: flex; flex-direction:column; justify-content: space-between; h4{ display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2; overflow: hidden; } .shoprightbot{ display: flex; justify-content: space-between; align-items: center; width: 190px; span{ font-size:17px; color:#F74022; } } } } .van-checkbox__icon--checked .van-icon{ background:red !important; } } button{ width:24px;height:26px; font-size:20px; background:#F74022; color:#ffffff; border:none; } input{ width:48px; } } .shopradd{ width: 98px; display: flex; .van-field__control{ text-align: center !important; } } .van-cell{ padding: 0; line-height: 26px } .van-field__control{ height: 26px; } </style>
關(guān)于vue.js組件的教程,請(qǐng)大家點(diǎn)擊專題vue.js組件學(xué)習(xí)教程進(jìn)行學(xué)習(xí)。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Vue3+TypeScript實(shí)現(xiàn)Docx/Excel預(yù)覽組件
這篇文章主要為大家詳細(xì)介紹了如何使用Vue3+TypeScript實(shí)現(xiàn)Docx/Excel預(yù)覽組件,文中的示例代碼講解詳細(xì),有需要的小伙伴可以參考下2024-04-04Vue通過vue-router實(shí)現(xiàn)頁面跳轉(zhuǎn)的全過程
這篇文章主要介紹了Vue通過vue-router實(shí)現(xiàn)頁面跳轉(zhuǎn)的操作步驟,文中有詳細(xì)的代碼示例和圖文供大家參考,對(duì)大家的學(xué)習(xí)或工作有一定的幫助,感興趣的朋友可以參考下2024-04-04Vue使用mind-map實(shí)現(xiàn)在線思維導(dǎo)圖
Vue中的Mind-Map通常是指使用Vue.js這個(gè)前端框架構(gòu)建的思維導(dǎo)圖組件或庫(kù),它可以幫助開發(fā)者在Web應(yīng)用中創(chuàng)建動(dòng)態(tài)、交互式的思維導(dǎo)圖,讓用戶可以直觀地組織信息和結(jié)構(gòu)化數(shù)據(jù),本文介紹了Vue使用mind-map實(shí)現(xiàn)在線思維導(dǎo)圖,需要的朋友可以參考下2024-07-07VUE3?Vite打包后動(dòng)態(tài)圖片資源不顯示問題解決方法
這篇文章主要給大家介紹了關(guān)于VUE3?Vite打包后動(dòng)態(tài)圖片資源不顯示問題的解決方法,可能是因?yàn)樵诓渴鸷蟮姆?wù)器環(huán)境中對(duì)中文文件名的支持不完善,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-09-09