本人看了vue官网上的教程后,感觉对vue的依稀有点了解,决定动手练习个小功能项目,就找了购物车本项目。
原文链接:http://blog.csdn.net/take_dream_as_horse/article/details/69942013
就找了这个小项目练习,在原项目的基础上做了如下进一步完善
1.增加了商品数量,合计金额(computed计算属性)
2.修改商品单价合计金额同步变化,增加商品(v-model),
3.增减商品数量(methods)
4.绑定button class背景,根据商品是否已经加入到购物车,动态显示button背景(就是v-bind:class的实际应用)。
5.删除单列商品(object.splice(index,1))
6.添加商品到商品列(对象浅拷贝用到的是object.assign({},obj),深拷贝var obj = JSON.stringify(this.newProduct);this.goods.push(JSON.parse(obj));//深拷贝)
。目前就做了这些改动,就是当练习。
源码:shopping_cart.js
1 //var newProduct = {name:'',color:'',price:0,amount:0,default_nums:1,add_nums:0,ischange:'btn-danger'}; 2 // 商品列表json 3 var goodsTable = new Vue({ 4 el: '#goods-table', 5 data: { 6 // 用于保存每件商品的对象 7 goodItem: {}, 8 // 用于保存用户添加到购车的商品数组 9 buyLists: [], 10 // 默认的商品列表 11 goods: [ 12 {name:'iphone 7 plus 手机',color:'银色',price:100,amount:0,default_nums:1,add_nums:0}, 13 {name:'华硕笔记本电脑',color:'黑色',price:100,amount:0,default_nums:1,add_nums:0}, 14 {name:'九阳电热水瓶5L',color:'白色',price:100,amount:0,default_nums:1,add_nums:0} 15 ], 16 //用于增加新商品到列表 17 newProduct: {name:'',color:'',price:0,amount:0,default_nums:1,add_nums:0,ischange:'btn-danger'}, 18 }, 19 computed: { 20 count: function() { 21 var num = 0; 22 for(var i in this.goods){ 23 num += parseInt(this.goods[i].default_nums); 24 } 25 return num; 26 }, 27 total: function() { 28 var total = 0; 29 for(var i in this.goods){ 30 total += parseInt(this.goods[i].price * this.goods[i].default_nums); 31 } 32 return total; 33 }, 34 addShoppingNum: function() { 35 var addShoppingNum = 0; 36 for(var i in this.goods){ 37 addShoppingNum += this.goods[i].add_nums; 38 } 39 return addShoppingNum; 40 }, 41 costPaid: function() { 42 var costPaid = 0; 43 for(var i in this.goods){ 44 costPaid += parseInt(this.goods[i].price * this.goods[i].add_nums); 45 } 46 return costPaid; 47 } 48 }, 49 methods: { 50 reduce: function(good) { 51 if (good.default_nums <= 1) return; 52 good.default_nums --; 53 //good.ischange = 'btn-danger'; 54 }, 55 addNum: function(good) { 56 good.default_nums += 1; 57 //good.ischange = 'btn-danger'; 58 }, 59 addProduct: function() { 60 //var len = this.goods.length; 61 //追加商品 62 //this.goods.push(Object.assign({},this.goods[len-1]));//浅拷贝 63 //this.goods.push(Object.assign({}, this.newProduct));//浅拷贝 64 var obj = JSON.stringify(this.newProduct); 65 this.goods.push(JSON.parse(obj));//深拷贝 66 }, 67 removeProduct: function(good,index) { 68 //删除商品 69 this.goods.splice(index,1); 70 }, 71 addToCar(good) { 72 if(good.add_nums == good.default_nums) return; 73 good.add_nums = good.default_nums; 74 //good.ischange = 'btn-success'; 75 this.goodItem = {name: good.name, nums: good.add_nums}; 76 // 创建用户当前添加的商品对象 77 // 开始向数组中提添加当前物品,这里存在3种情况 78 // 1、用户未添加过该商品,则直接向数组中push 79 // 2、用于已经添加了该商品、并且未做购买数量修改,则不向数组中添加 80 // 3、用于已经添加了该商品、但是修改了购买数量,直接替换数组中的该商品对象 81 var index = this.buyLists.findIndex((value, index, arr) => { 82 return value.name === this.goodItem.name; 83 }); 84 //Object.assign() 方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。 85 index === -1 ? this.buyLists.push(this.goodItem) : Object.assign(this.buyLists[index], this.goodItem); 86 }, 87 balance() { 88 console.log(this.buyLists); 89 } 90 } 91 })