vue實(shí)現(xiàn)的仿淘寶購(gòu)物車功能詳解
本文實(shí)例講述了vue實(shí)現(xiàn)的仿淘寶購(gòu)物車功能。分享給大家供大家參考,具體如下:
下面是一張眾所周知的淘寶購(gòu)物車頁(yè)面,今天要講解的案例就是用vue.js做一個(gè)類似的頁(yè)面

首先簡(jiǎn)單介紹一下可能會(huì)用到的一些vue.js的用法:
v-bind,綁定屬性;例如v-bind:class="{'class1':flag}",這是常用的綁定樣式的方法,如果flag為true則class=class1;v-bind:src="image",image就是圖像的路徑;
v-if="flag"與v-show="flag",如果flag為true,則綁定的為“可見”,不同的是v-show是一開始就渲染在DOM中的,改變的則是它的display而已,而v-if為false則是從HTML代碼中移除;
v-on:或@,樣式綁定v-on:click="dosomething()"或者@click="dosomething()",點(diǎn)擊觸發(fā)dosomething函數(shù);
v-for循環(huán),v-for="item in items",items為數(shù)組,item為items數(shù)組的值而不是索引;
要注意的是當(dāng)this作用域的改變:當(dāng)this作用域改變是我們?cè)O(shè)置var self = this,在之后的使用中用self代替;
下面是HTML代碼:
<html>
<head>
<title>購(gòu)物車</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" type="text/css" href="shop.css" rel="external nofollow" >
</head>
<body>
<div id="app">
<div class="header"><span style="margin-left: 75px;">商品</span><span style="margin-left: 70px;">單價(jià)</span><span style="margin-left: 35px;">數(shù)量</span><span style="margin-left: 40px;">總價(jià)</span></div>
<div v-for="item in goods">
<div class="show" v-show="item.selected">
<span class="choice" v-bind:class="{'checked':item.checked}" @click="check(item)"></span>
<div style="float:left;margin-left: 20px;"><img v-bind:src="item.image" v-bind:alt="item.alt" class="image"/><span class="text">{{item.name}}</span></div>
<span style="float:left;margin-left: 20px;margin-top:20px;width:40px;">{{item.price}}元</span>
<div style="float:left;margin-left: 30px;margin-top: 20px;">
<span v-on:click="changeNum(item,-1)"><a href="javascript:void(0)" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >-</a></span>
<input v-model="item.number" class="output" disabled/>
<span v-on:click="changeNum(item,1)"><a href="javascript:void(0)" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >+</a></span>
</div>
<div style="float:left;margin-left: 30px;margin-top: 25px;width:51px;">¥{{item.price * item.number}}元</div>
<span class="icon" @click="seen=true"></span>
</div>
</div>
<!--footer-->
<div id="footer">
<span class="choice" style="margin-top:18px;" v-bind:class="{'checked':checkAllFlag}"></span>
<a href="javascript:void(0)" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" @click="checkAll(true)">全選</a>
<a href="javascript:void(0)" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" style="color:;" @click="checkAll(false)">取消全選</a>
<span style="display:inline-block;margin-left:70px;width:95px;">Total:¥{{totalAll}}元</span>
<span><button class="count">結(jié) 算</button></span>
</div>
<div id="info" v-show="seen">
<p style="margin-top:20px;">是否刪除該商品?</p><div class="close" @click="seen=false">×</div>
<button class="get" style="padding-left:10px;" @click="">yes</button><button class="get" style="margin-left:20px;" @click="seen=false">no</button>
</div>
<div class="shadow" v-show="seen"></div>
</div>
</body>
<script src="./src/vue.min.js"></script>
<script src="./src/vue-resource.min.js"></script>
<script src="shop.js"></script>
</html>
下面的是js的代碼:
var vm = new Vue({
el:'#app',
data:{
total: 0,
totalAll: 0,
goods: [],//商品為數(shù)組
checkAllFlag: false,
seen: false,
delFlag: true
},
mounted: function () {
this.goodlist();
},
methods:{
//改變商品數(shù)量
changeNum:function (item,flag) {
if (flag>0) {
item.number++;
}else{
item.number--;
if(item.number<1){
item.number = 1;
}
}
this.totalMoney();
},
//是否選中
check:function (item) {
if(typeof item.checked == 'undefined'){
this.$set(item,"checked",true);
//局部為item添加“checked”,值為true
}else{
item.checked = !item.checked;
}
this.totalMoney();
},
//通過(guò)$http.get方法ajax地交互獲取商品信息,一定要引入vue-resource組件
goodlist:function () {
var self = this;
this.$http.get("shop.json").then(function (res) {
self.goods = res.data.result.goods;
},function () {
console.log("failed");
});
},
//是否全選
checkAll:function (flag) {
this.checkAllFlag = flag;
var self = this;
this.goods.forEach(function(value,index){
if(typeof value.checked == 'undefined'){
self.$set(value,"checked",self.checkAllFlag);
}else{
value.checked = self.checkAllFlag;
}
});
this.totalMoney();
},
//結(jié)算選中商品的價(jià)格
totalMoney:function () {
//初始化總價(jià)
this.totalAll = 0;
var self =this;
//通過(guò)foreach循環(huán)判斷是否被選中
this.goods.forEach(function(value,index){
if(value.checked){
self.totalAll += value.price * value.number;
}
});
}
}
})
下面是CSS代碼:
*{padding: 0;margin: 0;}
a{text-decoration: none;color: black;}
#app{width: 500px;height: 600px;border: 1px solid;position: absolute;margin-top:20px;margin-left:50px;}
.header{width: 500px;height: 30px;line-height: 30px;background-color: darkmagenta;}
.header span{display: inline-block;width: 50px;height: 30px;}
.show{width: 500px;height: 85px;margin-top: 5px;}
#footer{position: absolute;bottom: 0;width: 500px;height: 50px;background-color: #c7c7c9;}
.output{width: 40px;height: 20px;}
.image{width: 60px;height: 80px;float:left;}
.choice{display: inline-block;width: 15px;height: 15px;border-radius: 15px;border: 1px solid;float: left;margin-top: 30px;margin-left: 20px;}
.checked{background-color: darkorange;}
.icon{background-image: url(del.png);display: inline-block;width: 30px;height: 30px;margin-left: 50px;margin-top: 20px;}
.text{display:inline-block;width:50px;height:20px;line-height:20px;font:12px;margin-top:20px;margin-left:5px;float:left;}
.count{width:100px;height:40px;background-color:red;line-height:40px;font-size:16px;margin-left:40px;margin-top:5px;}
#footer a{display:inline-block;margin-left:5px;height:22px;}
#info{width:250px;height:100px;position:absolute;border:1px solid;margin-top:-250px;margin-left:120px;background-color:#c7c7c9;text-align:center;z-index:999;}
.get{width:80px;height:30px;font:17px;margin-top:10px;}
.shadow{width:100%;height:100%;background-color:black;opacity:0.8;margin-top:-480px;z-index:1;}
.close{position:absolute;right:2px;top:-5px;cursor:pointer;}
下面是json代碼:
{
"status":1,
"result":{
"total":50,
"goods":[
{
"name":"香煙",
"price":15,
"number":1,
"selected": true,
"image": "./img/xiangyan.jpg",
"alt": "香煙"
},
{
"name": "啤酒",
"price": 12,
"number": 1,
"selected": true,
"image": "./img/pjiu.jpg",
"alt": "啤酒"
},
{
"name": "打火機(jī)",
"price": 2,
"number": 1,
"selected": true,
"image": "./img/fire.jpg",
"alt": "打火機(jī)"
},
{
"name": "雞腿",
"price": 5,
"number": 1,
"selected": true,
"image": "./img/chick.jpg",
"alt": "雞腿"
},
{
"name": "垃圾袋",
"price": 8,
"number": 1,
"selected": true,
"image": "./img/bush.jpg",
"alt": "垃圾袋"
}
]
},
"message":""
}
實(shí)現(xiàn)的結(jié)果如下圖:

代碼下載:https://github.com/createor/vue/raw/master/vue.zip
或者點(diǎn)擊此處本站下載。
希望本文所述對(duì)大家vue.js程序設(shè)計(jì)有所幫助。
- 基于Vuejs實(shí)現(xiàn)購(gòu)物車功能
- Vue實(shí)現(xiàn)購(gòu)物車功能
- vue實(shí)現(xiàn)商城購(gòu)物車功能
- vuex實(shí)現(xiàn)的簡(jiǎn)單購(gòu)物車功能示例
- vue+vant-UI框架實(shí)現(xiàn)購(gòu)物車的復(fù)選框全選和反選功能
- Vue.js實(shí)現(xiàn)的購(gòu)物車功能詳解
- Vuejs實(shí)現(xiàn)購(gòu)物車功能
- vue.js實(shí)現(xiàn)簡(jiǎn)單購(gòu)物車功能
- Vue.js實(shí)現(xiàn)開發(fā)購(gòu)物車功能的方法詳解
- vue實(shí)現(xiàn)購(gòu)物車全部功能的簡(jiǎn)單方法
相關(guān)文章
前端vue+elementUI如何實(shí)現(xiàn)記住密碼功能
這篇文章主要給大家介紹了關(guān)于vue+elementUI如何實(shí)現(xiàn)記住密碼功能的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
Vue項(xiàng)目前端部署詳細(xì)步驟(nginx方式)
Nginx(engine x)是一個(gè)高性能的HTTP和反向代理web服務(wù)器,是部署前端項(xiàng)目的首選,這篇文章主要給大家介紹了關(guān)于Vue項(xiàng)目前端部署(nginx方式)的相關(guān)資料,需要的朋友可以參考下2023-09-09
在vue中使用express-mock搭建mock服務(wù)的方法
這篇文章主要介紹了在vue中使用express-mock搭建mock服務(wù)的方法,文中給大家提到了在vue-test-utils 中 mock 全局對(duì)象的相關(guān)知識(shí) ,需要的朋友可以參考下2018-11-11
Vue?export?default中的name屬性有哪些作用
這篇文章主要介紹了Vue?export?default中的name屬性有哪些作用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03
vue中多路由表頭吸頂實(shí)現(xiàn)的幾種布局方式
這篇文章主要介紹了vue項(xiàng)目多路由表頭吸頂實(shí)現(xiàn)的幾種布局方式,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-04-04

