Vue之简单购物车

Vue是一套用于构建用户界面的渐进式框架,只关注视图层。
其最为强大的特点就是响应的数据绑定和组件化,极大的减少了工作量。
使用MVVM开发模式,实现了视图与数据的分离。
轻量级的框架对计算机工作更加友好。
其作者尤雨溪在开发时保留了angular的优点,极大的解放了DOM操作。
提供中文文档,不存在语言障碍,十分易于学习。
相较于其他框架而言,优势更加明显。

(以下代码为个人练习时记录)

新建文件夹css+js+img以放置需要用到的文件
采用bootstrap布局
文末附css代码
(图片自行配制)

<!DOCTYPE html>
<html>

	<head>
		<meta charset="UTF-8">
		<title></title>
		<script src="js/bootstrap.js" type="text/javascript" charset="utf-8"></script>
		<script src="js/jquery-3.2.1.js" type="text/javascript" charset="utf-8"></script>
		<script src="js/vue.js" type="text/javascript" charset="utf-8"></script>
		<link rel="stylesheet" type="text/css" href="css/bootstrap.css" />
		<link rel="stylesheet" type="text/css" href="css/style.css"/>
	</head>

	<body>
		<div id="box">
			<nav class="navbar navbar-default" role="navigation">
			  <!-- Brand and toggle get grouped for better mobile display -->
			  <div class="navbar-header">
			    <a class="navbar-brand" href="#">首页</a>
			  </div>
			
			  <!-- Collect the nav links, forms, and other content for toggling -->
			  <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
			    <ul class="nav navbar-nav">
			      <li class="active"><a href="#" style="color: red;">全部商品</a></li>
			      <li><a href="#">优惠</a></li>
			      <li><a href="#">库存紧张</a></li>
			    </ul>
			    
			  </div><!-- /.navbar-collapse -->
			</nav>
			<p style="padding-left: 30px; margin-top: -10px;"><input type="checkbox" v-model="checkAll" @click="check"/>彭好大的店<img src="img/03.jpg" alt="" /></p>
			<table class="table table-striped table-bordered" id="table">
				<thead>
					<tr>
						<th><input type="checkbox" v-model="checkAll" @click="check"/>全选</th>
						<th>商品信息</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" v-model="checkFir" :value="item.id" @click="checkOne"/></td>
						<td style="text-align: left;"><img :src="item.imgs">{{item.name}}</td>
						<td>尺码:{{item.cm}}
							<br />
							颜色:{{item.color}}
						</td>
						<td><s>70</s><br />
							{{item.price}}
							<br />
							<span style="color: red;">7折</span>
						</td>
						<td style="width: 80px;">
							<div class="input-group">
							  <span class="input-group-addon" @click="down(index)">-</span>
							  <input type="text" class="form-control cou" :value="item.count" style="width: 50px;text-align: center;" disabled="disabled">
							  <span class="input-group-addon" @click="up(index)">+</span>
							</div>
							</td>
						<td>{{item.count*item.price}}</td>
						<td><button class="btn btn-danger btn-sm" @click="del(index)">删除</button></td>
					</tr>
					<tr>
						<td colspan="3" id="use"><input type="checkbox" v-model="checkAll" @click="check"/><b>全选</b>  删除  清空失效商品  移入收藏夹</td>
						<td colspan="3" id="user">共有<span style="color: red;">{{ad}}</span>件商品,总计¥<span style="color: red;">{{ap}}</span>元</td>
						<td><button class="btn btn-default btn-sm">去付款</button></td>
					</tr>
				</tbody>
			</table>
		</div>

	</body>

</html>
<script type="text/javascript">
	new Vue({
		el:"#box",
		data:{
			list:[
				{"name":"2019夏季新款韩版时尚背后小心机露背蝴蝶结修身针织衫上衣女","color":"黑色","cm":"均码","price":20,"id":1,"imgs":"img/1.jpg","count":1},
				{"name":"高腰短裤牛仔夏季女韩款阔腿裤显瘦a字短裤白色裤子","color":"蓝色","cm":"M","price":30,"id":2,"imgs":"img/2.jpg","count":2},
				{"name":"春夏短裙新款高腰显瘦牛仔半裙a字裙夏天短裙包裙a型牛仔群半身女","color":"浅色","cm":"L","price":40,"id":3,"imgs":"img/3.jpg","count":3}
			],
			checkFir:[],
			checkAll:false
		},
		methods:{
			//减
			down(index){
				//判断条件
				if(this.list[index].count>1){
					this.list[index].count--
				}
			},
			//加
			up(index){
				this.list[index].count++
			},
			//全选
			check(){
				//判断选中状态
				if(this.checkAll){
					//console.log(this.checkAll)
					//如果未选中则列表为空
					this.checkFir.length=0;
					//添加选中状态的复选框
					for(let i=0;i<this.list.length;i++){
						this.checkFir.push(this.list[i].id)
						//console.log(this.checkFir)
					}
					//反之为空
				}else{
					this.checkFir=[]
				}
			},
			//反选
			checkOne(){
				//判断如果选中的复选框长度等于自定义json的长度的时候 
				if(this.checkFir.length==this.list.length){
					this.checkAll=true
				}else{
					this.checkAll=false
				}
			},
			//删除
			del(index){
				//bug清除
				if(this.checkFir.indexOf(this.list[index].id)!=-1){
					this.checkFir.splice(this.checkFir.indexOf(this.list[index].id),1)
				}
				this.list.splice(index,1)
				this.checkOne()
			}
		},
		//计算总数及总价格
		computed:{
			//总数
			ad(){
				let sum=0;
				for(let i=0;i<this.list.length;i++){
					if(this.checkFir.indexOf(this.list[i].id)!=-1){
						sum+=this.list[i].count
					}
				}
				return sum
			},
			//总价
			ap(){
				let sum=0;
				for(let i=0;i<this.list.length;i++){
					if(this.checkFir.indexOf(this.list[i].id)!=-1){
						sum+=this.list[i].count*this.list[i].price
					}
				}
				return sum;
			}
		}
	})
	
	
	/*
	 
	 * 页面分步骤布局---vue绑定元素
	 * 渲染数据---自定义json格式数据并使用v-for渲染
	 * 加减实现---判断数量大小并进行加减
	 * 删除实现---根据ID删除当前数据
	 * 全选反选实现---使用v-model绑定表单元素判断状态
	 * 总数量与总价格实现---检测当前页面中是否有选中的ID并进行计算
	 * 
	 * */
	
	
</script>

css代码如下

th,
td {
  text-align: center;
}
td {
  line-height: 96px;
}
#use {
  text-align: left;
  padding-left: 28px;
}

猜你喜欢

转载自blog.csdn.net/ThroughWeb/article/details/89314045
今日推荐