本文实例讲述了vue实现的仿淘宝购物车功能。分享给大家供大家参考,具体如下:
下面是一张众所周知的淘宝购物车页面,今天要讲解的案例就是用vue.js做一个类似的页面
首先简单介绍一下可能会用到的一些vue.js的用法:
v-bind,绑定属性;例如v-bind:class="{'class1':flag}",这是常用的绑定样式的方法,如果flag为true则class=class1;v-bind:src="/UploadFiles/2021-04-02/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()",点击触发dosomething函数;
v-for循环,v-for="item in items",items为数组,item为items数组的值而不是索引;
要注意的是当this作用域的改变:当this作用域改变是我们设置var self = this,在之后的使用中用self代替;
下面是HTML代码:
<html> <head> <title>购物车</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;">单价</span><span style="margin-left: 35px;">数量</span><span style="margin-left: 40px;">总价</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="/UploadFiles/2021-04-02/item.image">下面的是js的代码:
var vm = new Vue({ el:'#app', data:{ total: 0, totalAll: 0, goods: [],//商品为数组 checkAllFlag: false, seen: false, delFlag: true }, mounted: function () { this.goodlist(); }, methods:{ //改变商品数量 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(); }, //通过$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(); }, //结算选中商品的价格 totalMoney:function () { //初始化总价 this.totalAll = 0; var self =this; //通过foreach循环判断是否被选中 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": "打火机", "price": 2, "number": 1, "selected": true, "image": "./img/fire.jpg", "alt": "打火机" }, { "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":"" }实现的结果如下图:
代码下载:https://github.com/createor/vue/raw/master/vue.zip
或者点击此处本站下载。
希望本文所述对大家vue.js程序设计有所帮助。
vue,仿淘宝,购物车
P70系列延期,华为新旗舰将在下月发布
3月20日消息,近期博主@数码闲聊站 透露,原定三月份发布的华为新旗舰P70系列延期发布,预计4月份上市。
而博主@定焦数码 爆料,华为的P70系列在定位上已经超过了Mate60,成为了重要的旗舰系列之一。它肩负着重返影像领域顶尖的使命。那么这次P70会带来哪些令人惊艳的创新呢?
根据目前爆料的消息来看,华为P70系列将推出三个版本,其中P70和P70 Pro采用了三角形的摄像头模组设计,而P70 Art则采用了与上一代P60 Art相似的不规则形状设计。这样的外观是否好看见仁见智,但辨识度绝对拉满。
更新动态
- 张学友《真情流露》HQ+S纯银深度[低速原抓WAV+CUE]
- 江志丰2012-七天[豪记][WAV+CUE]
- 黑鸭子2003《聆听柔情HQCD》[日本版][WAV+CUE]
- 群星《奔赴!万人现场 第5期》[FLAC/分轨][587.07MB]
- 关大洲《国家宝藏 第四季原声音乐 关大洲作品》[320K/MP3][109.49MB]
- 关大洲《国家宝藏 第四季原声音乐 关大洲作品》[FLAC/分轨][527.23MB]
- LOL双城之战大乱斗什么时候更新 双城大乱斗上线更新时间介绍
- s14全球总决赛冠军皮肤有什么 2024T1冠军皮肤选择一览
- faker加里奥s14决赛什么出装 faker加里奥s14决赛出装介绍
- 《马里奥与路易吉RPG:兄弟齐航》Fami通34分:路易吉存在感拉满
- 数据挖掘者新发现:NS继任机型或支持4K分辨率
- 宫本茂谈任天堂未来:研发费用增加但注重创意与传承
- 陈小云.2000-餐厅综艺金榜【海丽唱片】【WAV+CUE】
- 卓文萱.2008-翻滚吧!蛋炒饭电视原声带【滚石】【FLAC分轨】
- 顺子.2001-AND.MUSICS.THERE【EMI百代】【WAV+CUE】