vue實(shí)現(xiàn)購(gòu)物車結(jié)算功能
用vue做的購(gòu)物車結(jié)算的功能,供大家參考,具體內(nèi)容如下

代碼:
<!-- 占位 -->
<template>
<div>
<div class="product_table">
<div class="product_info">商品信息</div>
<div class="product_info">商品金額</div>
<div class="product_info">商品數(shù)量</div>
<div class="product_info">總金額</div>
<div class="product_info">編輯</div>
</div>
<div class="product_table" v-for="(item,index) in getProductList" :key="index">
<div style="width:20px;height:20px;border-radius:10px;border:1px solid black;" @click="checkSingle(item)" :class="{checked:item.makeChoose}"></div>
<div class="product_info">{{item.productName}}</div>
<div class="product_info">{{item.productPrice}}</div>
<span @click="changeNumber(item,1)">+</span>
<input type="text" v-model="item.prductQty" style="width: 30px;">
<span @click="changeNumber(item,-1)">-</span>
<div class="product_info">{{item.productPrice*item.prductQty}}</div>
<div class="product_info" @click="deleteProduct(index)">刪除</div>
</div>
<div style="width:20px;height:20px;border-radius:10px;border:1px solid black;margin-top:10px" @click="checkAll()" :class="{checked:checkAllItem}"></div>
<div>總價(jià)格:{{totalPrice}}</div>
</div>
</template>
<script>
import Vue from 'vue'
export default {
name: 'side-bar-placeholder',
data () {
return {
getProductList:[
{
productName:'西瓜',
productPrice:100,
prductQty:3
},
{
productName:'南瓜',
productPrice:50,
prductQty:2
},
{
productName:'蘋果',
productPrice:300,
prductQty:3
},
],
totalPrice:0, //總金額
checkAllItem:false, //全部選中
checkedList:[] //選中的數(shù)
}
},
methods:{
//刪除某一項(xiàng)
deleteProduct:function (index) {
this.getProductList.splice(index,1)
this.calcTotalPrice() //這里要注意,當(dāng)某一項(xiàng)刪除時(shí),如果你選中了,這里也是要做計(jì)算總價(jià)格的
},
//修改數(shù)量
changeNumber:function (number,add) {
if(add<0){
number.prductQty--;
if(number.prductQty<'1'){ //因?yàn)閿?shù)量最低是1
number.prductQty=1
}
}else{
number.prductQty++;
}
this.calcTotalPrice()
},
//選中單個(gè)的
checkSingle:function (item){
if(typeof item.makeChoose=='undefined'){ //這里要注意,因?yàn)閏hecked字段根本不在this.getProductList里面,所以你要自己賦值進(jìn)去
Vue.set(item, 'makeChoose',true) //這里應(yīng)該設(shè)為true
}else{
item.makeChoose=!item.makeChoose
}
this.calcTotalPrice()
},
//選中所有的
checkAll:function (){
this.checkAllItem=!this.checkAllItem
var _this=this
if(this.checkAllItem){
this.getProductList.forEach(element => {
if(typeof element.makeChoose=='undefined'){
Vue.set(element, 'makeChoose',_this.checkAllItem) //讓每一小項(xiàng)跟隨checkall來(lái)變化
}else{
element.makeChoose=_this.checkAllItem
}
});
}else{
this.getProductList.forEach(element => {
if(typeof element.makeChoose=='undefined'){
Vue.set(element, 'makeChoose',_this.checkAllItem)
}else{
element.makeChoose=_this.checkAllItem
}
});
}
this.calcTotalPrice()
},
//計(jì)算總金額
calcTotalPrice:function () {
var _this=this
this.totalPrice=0
this.getProductList.forEach((element,index) => {
if(element.makeChoose){
_this.totalPrice+=element.productPrice*element.prductQty //這里是一個(gè)累加的過(guò)程,所以要用+=
}
});
},
//讓頁(yè)面一進(jìn)來(lái)就處于選中的狀態(tài)
makeAllChecked:function () {
this.getProductList.forEach((item)=>{
if(typeof item.makeChoose=='undefined'){
Vue.set(item, 'makeChoose',true)
}
})
}
} ,
watch:{
//如果全部選中,那么全部選中的按鈕應(yīng)該變綠,如果一項(xiàng)不是,應(yīng)該變空
getProductList:{
handler:function (item) {
this.checkedList=this.getProductList.filter((element)=>{
return element.makeChoose==true;
})
//選中數(shù)<總數(shù)據(jù)
if(this.checkedList.length<this.getProductList.length){
this.checkAllItem=false
}else{
this.checkAllItem=true
}
},
deep:true //這個(gè)deep:true一定要寫,不然肯定不會(huì)時(shí)時(shí)變化的
}
} ,
created:function (){
this.makeAllChecked()
}
}
</script>
<style lang="less" scoped>
.product_table{
display: flex;
width: 100%;
}
.product_info{
flex:1;
}
.checked{
background-color:green;
}
</style>
這個(gè)代碼實(shí)現(xiàn)了什么?
1.在點(diǎn)擊加減時(shí)每個(gè)產(chǎn)品的總價(jià)變化,所有產(chǎn)品的總價(jià)變化
2.選中時(shí)才會(huì)結(jié)算
3.如果全部選中了每個(gè)子項(xiàng),全部選中按鈕會(huì)變綠,如果有一項(xiàng)不選中,那么會(huì)變白
4.一般的購(gòu)物車,我希望他一進(jìn)來(lái)就是checked的狀態(tài),提高購(gòu)買性
5.當(dāng)我刪除某一項(xiàng)時(shí),如果這一項(xiàng)是已經(jīng)checked了的,也要讓他在計(jì)算總價(jià)時(shí)重新計(jì)算.
ps:最后一行的按鈕是全部選中哦,或者是全部取消,忘記寫了。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Vue3中實(shí)現(xiàn)過(guò)渡動(dòng)畫的方法小結(jié)
這篇文章主要為大家詳細(xì)介紹了Vue3中實(shí)現(xiàn)過(guò)渡動(dòng)畫的一些常用方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-10-10
vue從零實(shí)現(xiàn)一個(gè)消息通知組件的方法詳解
這篇文章主要介紹了vue從零實(shí)現(xiàn)一個(gè)消息通知組件的方法,結(jié)合實(shí)例形式分析了vue實(shí)現(xiàn)消息通知組件的具體原理、實(shí)現(xiàn)步驟、與相關(guān)操作技巧,需要的朋友可以參考下2020-03-03
Vue?vant-ui框架實(shí)現(xiàn)上拉加載下拉刷新功能
功能需求——獲取后端接口返回的數(shù)據(jù),實(shí)現(xiàn)列表數(shù)據(jù)上滑加載更多下一頁(yè)數(shù)據(jù),下拉數(shù)據(jù)刷新功能,結(jié)合vant-ui框架實(shí)現(xiàn)??芍苯訁⒖际褂?/div> 2022-09-09
vue3.0 vue-router4.0打包后頁(yè)面空白的解決方法
本文主要介紹了vue3.0 vue-router4.0打包后頁(yè)面空白的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02
Vue+Openlayer批量設(shè)置閃爍點(diǎn)的實(shí)現(xiàn)代碼(基于postrender機(jī)制)
本篇文章給大家介紹基于postrender機(jī)制使用Vue+Openlayer批量設(shè)置閃爍點(diǎn)的實(shí)現(xiàn)代碼,代碼簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2021-09-09最新評(píng)論

