《vue.js实战》利用计算属性、指令等知识开发购物车练习一

购物车

需求分析

  1. 展示已加如购物车的商品列表,包含商品名称、商品单价、购买数量和操作信息。
  2. 实时显示购买的总价。
  3. 购买数量可以增加或减少。
  4. 每类商品还可以从购物车中移除。

项目文件

  1. index.html:引入资源及模板
  2. index.js:Vue实例及业务代码
  3. style.css:样式

项目代码

index.html

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>购物车示例</title>
		<link rel="stylesheet" type="text/css" href="style.css" />
	</head>
	<body>
		<div id="app" v-cloak>
			<template v-if="list.length">
				<table>
					<thead>
						<tr>
							<th>全选<input type="checkbox" v-model="checkAll"></input></th>
							<th>序号</th>
							<th>商品名称</th>
							<th>商品单价</th>
							<th>购买数量</th>
							<th>操作</th>
						</tr>
					</thead>
					<tbody>
						<tr v-for="(item, index) in list">
							<td><input type="checkbox" :checked="item.done" @change="checkShop(index)" /></td>
							<td>{{index + 1}}</td>
							<td>{{item.name}}</td>
							<td>{{item.price}}</td>
							<td><button type="button" @click="handleReduce(index)"
									:disabled="item.count == 1">-</button>
								{{item.count}}
								<button type="button"
									@click="handleAdd(index)">+</button>		
							</td>
							<td>
								<button type="button" @click="handleRemove(index)">移除</button>
							</td>
						</tr>
					</tbody>
				</table>
				<div>总价:¥{{totalPrice}}</div>
			</template>
			<div v-else>购物车为空</div>
		</div>
		<script type="text/javascript" src="../js/vue.js"></script>
		<script type="text/javascript" src="index.js"></script>
	</body>
</html>

index.js

var app = new Vue({
	el:'#app',
	data:{
		list:[
			{
				id:1,
				name:'iPhone 7',
				price:6188,
				count:1,
				done:false
			},
			{
				id:2,
				name:'iPad Pro',
				price: 5888,
				count:1,
				done:false
			},
			{
				id:3,
				name:'MacBook Pro',
				price:21488,
				count:1,
				done:false
			}
		]
	},
	computed:{
		totalPrice:function(){
			var total = 0;
			for (var i = 0; i < this.list.length; ++i){
				var item = this.list[i];
				if (item.done == false){
					continue;
				}	
				total += item.price * item.count;
			}
			return total.toString().replace(/\d(?=(?:\d{3})+\b)/g, '$&,');
		},
		checkAll:{
			get:function(){
				var flag = true;
				this.list.forEach((item)=>{
					if (item.done == false) flag = false;
				})
				return flag;
			},
			set:function(value){
				this.list.forEach((item)=>{
					item.done = value;
				})
			}
		}
	},
	methods:{
		handleReduce:function(index){
			if (this.list[index].count == 1) return;
			this.list[index].count--;
		},
		handleAdd:function(index){
			this.list[index].count++;
		},
		handleRemove:function(index){
			this.list.splice(index, 1);
		},
		checkShop:function(index){
			this.list[index].done = !this.list[index].done; 
		}
	}
})

style.css

[v-cloak]{
	display:none;
}
table{
	border: 1px solid #e9e9e9;
	border-collapse: collapse;
	border-spacing: 0;
	empty-cells: show;
}
th, td{
	padding: 8px 16px;
	border: 1px solid #e9e9e9;
	text-align: left;
}
th{
	background: #f7f7f7;
	color: #5c6b77;
	font-weight: 600;
	white-space: nowrap;
}

运行效果

《vue.js实战》利用计算属性、指令等知识开发购物车练习一

上一篇:Python可以玩贪吃蛇等一切小游戏!玩过这游戏的肯定25以上了!


下一篇:高性能 Web 缓存服务器 nuster 1.7.9.5 发布