vue 实现购物车

购物车是电商必备的功能,可以展示出用户购买的多个商品以及价格信息。

最近在做一个电商的项目,使用了vue.框架,一个轻量级的mvvm,数据变化视图一起变化;为了响应式布局,使用了bootstrap

该购物车的主要功能有,增加购买数量,价格实时变化,可以单选,全选,不选。

页面全选按钮,如果下方按钮均选中则默认选中,有一个没选中就不选



代码的实现函数和注意写在注释和下面的介绍

html

单个商品金额使用{{good.price*good.num}}

数量框中加减的数字使用{{good.num}} 并且使用三元运算符,保证在数量大于0时可以点+ @click="good.num>0?good.num--:0",其他情况下-按钮不可以点

在实现时使用了两种该方法:

1.使用v-if指令来决定全选按钮的状态

 <div class="col-lg-1 col-md-1" v-if="isAllselect()==true" @click="selectNone()">
					<input type="checkbox" id="none" value="all" v-model="checkedNames" ref="checkBox_" >
                	<label for="all">全选</label>
				</div>
				<div class="col-lg-1 col-md-1" v-else @click="selectAll()">
					<input type="checkbox" id="none" value="all" v-model="checkedNames" ref="checkBox_"  >
                	<label for="all">全选</label>
				</div> 
2.methods函数中判断全选按钮状态
<div id="app">
		<div class="container">
			<div class="row">
				<div class="col-lg-1 col-md-1"  @change="checked">
					<!-- 用 v-model 指令在表单 <input> 及 <textarea> 元素上创建双向数据绑定 -->
					<input type="checkbox" id="none" value="false" ref="checkBox_"  >
                	<label for="none">全选</label>
				</div>
				<div class="col-lg-1 col-md-1">序号</div>
				<div class="col-lg-3 col-md-3">图片</div>
				<div class="col-lg-3 col-md-3">价格</div>
				<div class="col-lg-2 col-md-2">数量</div>
				<div class="col-lg-2 col-md-2">金额</div>
			</div>
			<!-- v-for循环 -->
			<div class="row" v-for="(good,index) in data_">
				<div class="col-lg-1 col-md-1" @change="check_isAll">
				<input type="checkbox" v-model="good.checked">
			</div>
			<div class="col-lg-1 col-md-1">{{index+1}}</div>
			<div class="col-lg-3 col-md-3">
				<img :src="good.img" alt="">
			</div>
			<div class="col-lg-3 col-md-3">{{good.price}}</div>
			<div class="col-lg-2 col-md-2">
				<span @click="good.num<1?0:good.num--">-</span><span class="num" contenteditable="true">{{good.num}}</span><span @click="good.num++">+</span>
			</div>
			<!-- 计算出当前选项总金额 -->
			<div class="col-lg-2 col-md-2">{{good.price * good.num}}</div>
			</div>
			<div class="row">
				<div class="col-lg-6 col-md-6"></div>
				<!-- 使用calc()进行选择件数和进行总价的计算 -->
				<div class="col-lg-3 col-md-3">
					共选择了<span>{{calc().cnt}}</span>件商品
				</div>
				<div class="col-lg-3 col-md-3">
					总计<span>{{calc().totalPrice}}</span>
				</div>
			</div>
		</div>
	</div>

javascript

绑定事件

1.使用了v-on:的方式,也可以使用简写@事件名

2.input 单选框选中,不选中使用v-model绑定

<script>
		var goods= {
            data_: [{
                id: 1,
                name: '小吃1',
                img: 'img/0.jpg',
                price: '26.00',
                num: 0,
                checked: false
            }, {
                id: 2,
                name: '小吃2',
                img: 'img/1.jpg',
                price: '25.00',
                num: 0,
                checked: false
            }, {
                id: 3,
                name: '小吃3',
                img: 'img/2.jpg',
                price: '20.00',
                num: 0,
                checked: false
            }, {
                id: 4,
                name: '小吃4',
                img: 'img/3.jpg',
                price: '18.00',
                num: 0,
                checked: false
            }, {
                id: 5,
                name: '小吃5',
                img: 'img/4.jpg',
                price: '16.00',
                num: 1,
                checked: false
            }]
        };
        // 使用localstorage保存当前页面的选择,保证在下一次进入或者刷新页面选择按钮和选择数量不变
		var goodObj=localStorage.goods?JSON.parse(localStorage.goods):goods;
		var vm=new Vue({
			el:'#app',
			data:goodObj,
			mounted:function(){
			  this.check_isAll();
			},
			methods:{
			    update:function(){
			      localStorage.setItem('goods',JSON.stringify(this.$data));//更新函数,在每次有变化都需要调用并修改localstroage
				},
				// 判断是否页面所有单选按钮是不是被选中,如果均选中则全选按钮默认被选中
				check_isAll(){
					var check_el=document.getElementById('none');
					if(this.isAllselect()){ 
						check_el.checked=true;
					}else{
						check_el.checked=false;
					}
					this.update();
				},
				checked(){
					// 获取当前全选按钮状态,并给单选按钮赋相对应的值
					var el=event.target;
					var check_=el.checked;
					// debugger;
					for(var i = 0;i < this.data_.length;i++){
						this.data_[i].checked=check_;
					}
					this.update();
				}
				,
				// 使用数组every方法判断是否全选中单选按钮
				isAllselect:function(){
					return this.data_.every(function(item){
						// console.log(index);
						return item.checked==true;
					})
				},
				// 计算相关的总数量个总金额
				calc:function(){
					var pro=this.data_.filter(function(item){
						return item.checked==true;
					});
					var totalPrice=0;
					for(var i = 0; i < pro.length;i++){
						totalPrice+=pro[i].price*pro[i].num;
					}
					return {cnt:pro.length,totalPrice:totalPrice}
				}
			}
		})
	</script>

css

<style>
		.container{
			text-align: center;
		}
		.container .row{
			/*height: 100px;*/
			border: 1px solid #eee;
		}
		img{
			width: 100px;
			height: 100px;
			vertical-align: middle;
		}
		span{
			width: 20px;
			height: 20px;
			border: 1px solid #999;
			background:#eee;
			display:inline-block;
		}
		.num{
			background:transparent;
			border-left: none;
			border-right: none;
		}
	</style>

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值