vue實(shí)現(xiàn)購(gòu)物車案例
本文實(shí)例為大家分享了vue實(shí)現(xiàn)購(gòu)物車的具體代碼,供大家參考,具體內(nèi)容如下
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>購(gòu)物車案例</title> <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> </head> <style> *{ padding: 0; margin:0 } ul li{ width: 1200px; display: flex; align-items: center; justify-content: center; } li div,.total{ display: inline-block; width:200px; height: 50px; line-height: 50px; text-align: center; } button{ width: 60px; height: 40px; text-align: center; line-height: 40px; } </style> <body> <div id="app"> <ul> <goodsitem v-for="item in goodslist" :item="item" :key="item.id" @onchange="(type)=>{handleCount(type,item)}" @ondelete="()=>{handleDelete(item.id)}"> </goodsitem> <div class="total" style="padding-left: 113px">總價(jià):{{total}}</div> </ul> </div> </body> <script> var computed={ props:{ count:{ type:Number, require:true } }, methods:{ handleCount(type){ this.$emit('onchange',type) } }, template:`<div style="width:200px"> <button @click="handleCount('sub')">-</button> <span>{{count}}</span> <button @click="handleCount('add')" >+</button> </div> ` } var goodsitem={ props:{ item:{ type:Object, require:true } }, methods:{ handleCount(type){ this.$emit('onchange',type) }, handleDelete(){ this.$emit('ondelete') } }, components:{ computed }, template:`<li> <div>{{item.goodsName}}</div> <div>{{item.price}}</div> <computed :count="item.count" @onchange="handleCount"></computed> <div>{{item.sum}}</div> <div><button @click="handleDelete">刪除</button></div> </li> ` } var app=new Vue({ el:"#app", data:{ goodslist:[{ id:1, goodsName:"小可愛(ài)", price:100, count:1, sum:100 },{ id:2, goodsName:"小可愛(ài)", price:200, count:2, sum:400 },{ id:3, goodsName:"小可愛(ài)", price:300, count:3, sum:900 },{ id:4, goodsName:"小可愛(ài)", price:400, count:1, sum:400 }, ] }, methods:{ handleCount(type,item){ if(type=='add'){ item.count+=1 }else{ if(item.count==1){ this.handleDelete(item.id) return } item.count-=1 } item.sum=item.count*item.price }, handleDelete(id){ return this.goodslist=this.goodslist.filter((item)=>{ return id!=item.id }) } }, computed:{ total(){ return this.goodslist.reduce((total,item)=>{ return total+=item.sum },0) } }, components:{ goodsitem } }) </script> </html>
實(shí)現(xiàn)效果圖:
小編再為大家分享一段收藏的vue購(gòu)物車邏輯代碼,也謝謝原作者的分享
<template> <div class="hello"> <div class="main"> <div v-if="hasList"> <div class="cart-box"> <div class="cart-list" v-for="(item,index) in carts" :key="index"> <!-- <icon v-if="item.selected" type="success" color="red" data-index="index" class="cart-pro-select" @click="selectList"/> <icon v-else type="circle" class="cart-pro-select" data-index="index" @click="selectList"/> --> <router-link to="/"><img class="cart-thumb" :src="item.image" /></router-link> <p class="cart-pro-name">{{item.title}}</p> <p class="cart-pro-price">¥{{item.price}}</p> <div class="cart-count-box"> <p class="cart-count-down" @click="minusCount(item.id)" data-obj="obj" data-index="index">-</p> <p class="cart-count-num">{{item.num}}</p> <p class="cart-count-add" @click="addCount(item.id)" data-index="index">+</p> </div> <p class="cart-del" @click="deleteList" data-index="index">×</p> </div> </div> <div class="cart-footer"> <!-- <icon v-if="selectAllStatus" type="success_circle" color="#fff" class="total-select" @click="selectAll"/> <icon v-else type="circle" color="#fff" class="total-select" @click="selectAll"/> --> <div class="order-icon"> <router-link to="/"><img src="../../static/image/icon3.png" /></router-link> </div> <p>全選</p> <p class="cart-toatl-price">¥{{totalPrice}}</p> </div> </div> <div v-else> <div class="cart-no-data">購(gòu)物車是空的哦~</div> </div> </div> </div> </template> <script> // import {Toast} from 'vant' export default { data () { return { carts: [{id: 1, title: '新鮮芹菜 半斤', image: '../../static/image/s5.png', num: 4, price: 0.01, selected: true}, {id: 2, title: '素米 500g', image: '../../static/image/s6.png', num: 1, price: 0.03, selected: true}], hasList: true, totalPrice: 0, selectAllStatus: true, obj: { name: 'hello' } } }, created () { // this.$set({ // hasList: true, // carts: [ // {id: 1, title: '新鮮芹菜 半斤', image: '../../static/image/s5.png', num: 4, price: 0.01, selected: true}, // {id: 2, title: '素米 500g', image: '../../static/image/s6.png', num: 1, price: 0.03, selected: true} // ] // }) this.getTotalPrice() }, methods: { selectList (e) { console.log(e) let carts = this.carts let index = 1 const selected = carts[index].selected carts[index].selected = !selected this.setData({ carts: carts }) this.getTotalPrice() }, deleteList (e) { const index = e.currentTarget.dataset.index let carts = this.carts carts.splice(index, 1) this.$set({ carts: carts }) if (!carts.length) { this.$set({ hasList: false }) } else { this.getTotalPrice() } }, selectAll (e) { let selectAllStatus = this.data.selectAllStatus selectAllStatus = !selectAllStatus let carts = this.carts for (let i = 0; i < carts.length; i++) { carts[i].selected = selectAllStatus } this.$set({ selectAllStatus: selectAllStatus, carts: carts }) this.getTotalPrice() }, addCount (e) { let carts = this.carts let num = carts[e - 1].num num = num + 1 carts[e - 1].num = num this.$set(this.carts, carts) this.getTotalPrice() }, minusCount (e) { // const obj = e.currentTarget.dataset.obj let carts = this.carts let num = carts[e - 1].num if (num <= 1) { return false } num = num - 1 carts[e - 1].num = num this.$set(this.carts, carts) this.getTotalPrice() }, getTotalPrice () { let carts = this.carts let total = 0 for (let i = 0; i < carts.length; i++) { if (carts[i].selected) { total += carts[i].num * carts[i].price } } this.$set({ carts: carts, totalPrice: total.toFixed(2) }) } } } </script> <!-- Add "scoped" attribute to limit CSS to this component only --> <!-- scoped css樣式僅僅在當(dāng)前模板使用--> <style scoped> .cart-box{ padding-bottom: 50px; } .cart-list{ position: relative; padding: 10px 10px 10px 142px; height: 92px; border-bottom: 1px solid #e9e9e9; } .cart-list .cart-pro-select{ position: absolute; left: 10px; top: 45px; width: 25px; height: 25px; } .cart-list .cart-thumb{ position: absolute; top: 10px; left: 42px; width: 92px; height: 92px; } .cart-list .cart-pro-name{ display: inline-block; width: 150px; height: 52px; line-height: 25px; overflow: hidden; } .cart-list .cart-pro-price{ display: inline-block; float: right; height: 52px; line-height: 25px; } .cart-list .cart-count-box{ position: absolute; left: 142px; bottom: 10px; width: 125px; height: 40px; } .cart-list .cart-count-box p{ display: inline-block; line-height: 40px; p-align: center; } .cart-count-down,.cart-count-add{ position: absolute; top:-5px; font-size: 22px; width: 25px; height: 100%; } .cart-count-num{ margin-left: 17px; width: 75px; } .cart-del{ position: absolute; right: 10px; bottom: 0px; width: 40px; height: 40px; line-height: 40px; p-align: center; font-size: 22px; } .cart-footer{ position: fixed; bottom: 15%; left: 0; width: 100%; height: 45px; line-height: 45px; box-sizing: border-box; background: #AB956D; color: #fff; } .total-select{ position: absolute; left: 10px; top: 12px; width: 22px; height: 22px; } .order-icon{ position: absolute; right: 20px; top: 12px; width: 24px; height: 24px; } .order-icon image,.order-icon navigator{ display: block; width: 24px; height: 24px; } .cart-toatl-price{ float: right; width: 60px; } .cart-no-data{ padding:20px 0; color: #999; p-align: center; } </style>
更多文章可以點(diǎn)擊《Vue.js前端組件學(xué)習(xí)教程》學(xué)習(xí)閱讀。
關(guān)于vue.js組件的教程,請(qǐng)大家點(diǎn)擊專題vue.js組件學(xué)習(xí)教程進(jìn)行學(xué)習(xí)。
更多vue學(xué)習(xí)教程請(qǐng)閱讀專題《vue實(shí)戰(zhàn)教程》
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- vue.js實(shí)現(xiàn)簡(jiǎn)單購(gòu)物車功能
- vue實(shí)現(xiàn)購(gòu)物車功能(商品分類)
- vue實(shí)現(xiàn)淘寶購(gòu)物車功能
- vuejs手把手教你寫一個(gè)完整的購(gòu)物車實(shí)例代碼
- 基于Vuejs實(shí)現(xiàn)購(gòu)物車功能
- Vue實(shí)現(xiàn)購(gòu)物車功能
- vue實(shí)現(xiàn)商城購(gòu)物車功能
- Vuejs實(shí)現(xiàn)購(gòu)物車功能
- vuex實(shí)現(xiàn)的簡(jiǎn)單購(gòu)物車功能示例
- vue實(shí)現(xiàn)購(gòu)物車加減
相關(guān)文章
vue vue-Router默認(rèn)hash模式修改為history需要做的修改詳解
今天小編就為大家分享一篇vue vue-Router默認(rèn)hash模式修改為history需要做的修改詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-09-09vue配置生產(chǎn)環(huán)境.env.production與測(cè)試環(huán)境.env.development
這篇文章主要介紹了vue配置生產(chǎn)環(huán)境.env.production與測(cè)試環(huán)境.env.development方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-10-10vue2中,根據(jù)list的id進(jìn)入對(duì)應(yīng)的詳情頁(yè)并修改title方法
今天小編就為大家分享一篇vue2中,根據(jù)list的id進(jìn)入對(duì)應(yīng)的詳情頁(yè)并修改title方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-08-08el-form表單實(shí)現(xiàn)校驗(yàn)的示例代碼
本文主要介紹了el-form表單實(shí)現(xiàn)校驗(yàn)的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-07-07vue+element項(xiàng)目實(shí)時(shí)監(jiān)聽(tīng)div寬度的變化
這篇文章主要介紹了vue+element項(xiàng)目里實(shí)時(shí)監(jiān)聽(tīng)某個(gè)div寬度的變化,然后執(zhí)行相應(yīng)的事件,本文結(jié)合示例代碼給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧2024-08-08vue打包生成的文件的js文件過(guò)大的優(yōu)化方式
這篇文章主要介紹了vue打包生成的文件的js文件過(guò)大的優(yōu)化方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-04-04vue.js 嵌套循環(huán)、if判斷、動(dòng)態(tài)刪除的實(shí)例
下面小編就為大家分享一篇vue.js 嵌套循環(huán)、if判斷、動(dòng)態(tài)刪除的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-03-03vue使用html2canvas和jspdf將html轉(zhuǎn)成pdf
在前端開(kāi)發(fā)中, html轉(zhuǎn)pdf是最常見(jiàn)的需求,下面這篇文章主要給大家介紹了關(guān)于vue如何使用html2canvas和jspdf將html轉(zhuǎn)成pdf的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-03-03