分别使用使用jQuery和Vue完成点餐系统

需求说明:

1.当点击点餐按钮时,对应的菜品将被添加到购物车当中,并且在“点餐按钮”被点击时候,不能被再次点击;

2.购物车中的操作:点击“+”或“-”,被选中菜品的数量以及购物车中的菜品总数和总额相应变化;当被选中菜品的数量小于1时,将被从购物车中删除,同时它的点餐按钮回复可选状态;

3:当点击清空购物车时,购物车内的菜品全部被删除,菜品总数和总额同时清零,所有点餐按钮恢复可点击状态。

/*------------------------------------jQuery版---------------------------------------*/

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>点餐jQuery版</title>
<style>
*{ margin:0; padding:0}
body{font-size:14px}
h1,h2,h3,h4,h5,h6{ font-weight:normal}
ul{ list-style:none}
i,strong,em{ font-style:normal; font-weight:normal}
p,dt,dd{ padding:5px 0}
button{ padding:5px 10px}
.wrap{ width:500px; padding:20px;position: relative;margin: auto;top: 0;left: 0;right: 0;bottom: 0;}
li{ padding:10px; margin-bottom:20px; background:#efefef; position:relative;border-radius: 10px;}
hr{ margin:50px 0}
h2,dt{ font-size:24px; font-weight:bold; padding:10px 0}
h5{ font-size:16px; font-weight:bold}
h6{font-size:14px; padding:5px 0}
.cateList p{ font-size:12px; margin-right:80px}
.cateList .orderBtn{ position:absolute; top:20px; right:20px; border-radius: 5px;}
.shopping_cart{ position:relative}
.shopping_cart .price{ position:absolute; top:10px; right:10px; font-size:18px;}
.shopping_cart em{ font-size:24px}
.clearBtn{ position:absolute; top:10px; right:0;}
.shoppingList{position: relative;}
.shoppingList .price{position: absolute; top: 5px; right:10px;}
.shoppingList h5{margin-bottom: 20px;}
</style>
</head>

<body>
<div class="wrap">
	<h2>菜单</h2>
	<ul class="cateList">
        <li id="cate1" data-name="宫保鸡丁" data-price="22">
            <h5>宫保鸡丁</h5>
            <p>是一道闻名中外的特色传统名菜。鲁菜、川菜、贵州菜中都有收录,原料、做法有差别。</p>
            <h6>价格:<em>22</em></h6>
            <button type="button" class="orderBtn">点餐</button>
        </li>
        <li id="cate2" data-name="鱼香肉丝" data-price="18">
            <h5>鱼香肉丝</h5>
            <p>是一道闻名中外的特色传统名菜。鲁菜、川菜、贵州菜中都有收录,原料、做法有差别。</p>
            <h6>价格:<em>18</em></h6>
            <button type="button" class="orderBtn">点餐</button>
        </li>
        <li id="cate3" data-name="红烧茄子" data-price="15">
            <h5>红烧茄子</h5>
            <p>是一道闻名中外的特色传统名菜。鲁菜、川菜、贵州菜中都有收录,原料、做法有差别。</p>
            <h6>价格:<em>15</em></h6>
            <button type="button" class="orderBtn">点餐</button>
        </li>
    </ul>
    <hr>
    
    <div class="shopping_cart">
        
        <dl>
            <dt>购物车</dt>
            <dd id="total_count">总数:<em>0</em>元</dd>
            <dd id="total_price">总额:<em>0</em>元</dd>
            <dd><button id="clearBtn" type="button" class="clearBtn">清空购物车</button></dd>
        </dl>
        
        
        
        <ul id="shoppingList" class="shoppingList">
            <!--<li>
                <h5>宫保鸡丁</h5>
                <p>价格:<em>28</em></p>
                <p><button type="button">-</button> 数量:<em>1</em> <button type="button">+</button></p>
            </li>-->
        </ul>
    
    </div>

</div>

</body>
</html>
<script src="jquery-1.11.3.min.js"></script>

<script>
	var cate_arr=[
		/*{	
			"id":"cate1",
			"name":"宫保鸡丁",
			"price":32,
			"num":1,
		},*/
	];  //设置空数组,用来盛放被点的菜品的json数据,交于后台使用

	
//点餐
$('.orderBtn').click(function(){
	
	$(this).prop('disabled',true);//按钮禁用
	
	var pa=$(this).parent('li');  //点餐按钮的父级元素(li)
	var json={};	//定义一个空的json
	json.id=pa.attr('id');  //为json添加'li'的属性-->id
	json.name=pa.attr('data-name'); //为json添加'li'的属性-->data-name
	json.price=pa.attr('data-price'); //为json添加'li'的属性-->data-price
	json.num=1;
	cate_arr.push(json);  //将被选中的菜品的id、菜名、价格以json格式追加进cate_arr数组中
	console.log(cate_arr)
	
	//刷新购物车
	ref(cate_arr);
	
});



function ref(arr){  //刷新购物车函数 传入数组(cate_arr 被选菜品)参数
	var total_count=0;//总数量
	var total_price=0;//总价格
	var html="";  //初始化购物车内容
	for(var i=0; i<arr.length; i++){  //for循环被选菜品数组 
		html+='<li data-id="'+arr[i].id+'"><h5>'+arr[i].name+'</h5><p class="price">价格:<em>'+arr[i].price+'</em></p><p><button class="subBtn" type="button">-</button> 数量:<em>'+arr[i].num+'</em> <button class="addBtn" type="button">+</button></p></li>';  //购物车加入内容
		total_count+=arr[i].num;//总数量
		total_price+=arr[i].price*arr[i].num;	//总价格
	};
	$('#shoppingList').empty().append(html);  //先清空购物车内容,在添加新的内容
	$('#total_count em').text(total_count);
	$('#total_price em').text(total_price);
};



//购物车加减数量

$('#shoppingList').on('click','.subBtn,.addBtn',function(){  //绑定事件监听
	var cls=$(this).prop('class');
	var em=$(this).siblings('em');
	var pa=$(this).parents('li');
	var n=parseInt(em.text());
	
	switch(cls){
		case "subBtn":
		n--;  
		for(var j=0; j<cate_arr.length; j++){
			if(cate_arr[j].id==pa.attr('data-id')){
				cate_arr[j].num=n;
				if(n<1){  //当菜品数量被减至小于1时,删除被选菜品
					pa.remove();
					$('#'+cate_arr[j].id+' .orderBtn' ).prop('disabled',false);  //恢复按钮点击状态
					cate_arr.splice(j,1);  //数组中删除数据
				};
				ref(cate_arr);		
			}
		};
		em.text(n);
		
		break;
		case "addBtn":
		n++;
		for(var j=0; j<cate_arr.length; j++){
			if(cate_arr[j].id==pa.attr('data-id')){
				cate_arr[j].num=n;
				ref(cate_arr);		
			}
		};
		em.text(n);
		break;
	}

})


//清空购物车
$('#clearBtn').click(function(){
	$('#shoppingList').empty();
	$('#total_count em').text(0);
	$('#total_price em').text(0);
	$('.orderBtn').prop('disabled',false);
	cate_arr=[];
});
	
</script>

/*------------------------------------vue版---------------------------------------*/

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>点餐Vue版</title>
<script src="vue.js"></script>
<style>
*{ margin:0; padding:0}
body{font-size:14px}
h1,h2,h3,h4,h5,h6{ font-weight:normal}
ul{ list-style:none}
i,strong,em{ font-style:normal; font-weight:normal}
p,dt,dd{ padding:5px 0}
button{ padding:5px 10px}
.wrap{ width:500px; padding:20px;position: relative;margin: auto;top: 0;left: 0;right: 0;bottom: 0;}
li{ padding:10px; margin-bottom:20px; background:#efefef; position:relative;border-radius: 10px;}
hr{ margin:50px 0}
h2,dt{ font-size:24px; font-weight:bold; padding:10px 0}
h5{ font-size:16px; font-weight:bold}
h6{font-size:14px; padding:5px 0}
.cateList p{ font-size:12px; margin-right:80px}
.cateList .orderBtn{ position:absolute; top:20px; right:20px; border-radius: 5px;}
.shopping_cart{ position:relative}
.shopping_cart .price{ position:absolute; top:10px; right:10px; font-size:18px;}
.shopping_cart em{ font-size:24px}
.clearBtn{ position:absolute; top:10px; right:0;}
.shoppingList{position: relative;}
.shoppingList .price{position: absolute; top: 5px; right:10px;}
.shoppingList h5{margin-bottom: 20px;}
</style>
</head>

<body>
<div class="wrap" id="box">
	<h2>菜单</h2>
	<ul class="cateList">
        <!-- v-for指令将所有菜品加入到li中 -->
        <li v-for='(item,i) in arr'>
        	<h5>{{ item.name }}</h5>  <!-- 菜名 -->
        	<p>{{ item.des }}</p>  <!-- 描述 -->
        	<h6>{{ item.price }}</h6>  <!-- 价格 -->
        	<button type="button" class="orderBtn" @click='order(i)' :disabled='item.disable'>点餐</button>  <!-- 绑定点击事件(点菜函数) -->
        </li>

    </ul>
    <hr>
    
    <div class="shopping_cart">
        
        <dl>
            <dt>购物车</dt>
            <dd id="total_count">总数:<em>{{ totalNum }}</em>个</dd>
            <dd id="total_price">总额:<em>{{ totalPrice }}</em>元</dd>
            <dd><button id="clearBtn" type="button" class="clearBtn" @click='clear'>清空购物车</button></dd>
        </dl>
        
        <ul id="shoppingList" class="shoppingList">
            <!--<li>
                <h5>宫保鸡丁</h5>
                <p>价格:<em>28</em></p>
                <p><button type="button">-</button> 数量:<em>1</em> <button type="button">+</button></p>
            </li>-->
            <li v-for='(item,i) in shoppingList'>
            	<h5>{{ item.name }}</h5>
            	<p class="price">价格:<em>{{ item.price }}</em></p>
                <p><button type="button" @click='sub(i)'>-</button> 数量:<em>{{ item.num }}</em> <button type="button" @click='add(i)'>+</button></p>
            </li>
        </ul>
    
    </div>

</div>

</body>
</html>
<script>
	var vm=new Vue({
		el: '#box',
		data: {
			arr:[  //将菜品以json对象的方式装入arr数组中 name-菜名 des-菜品描述 price-价格 disable-按钮状态  mark-在数组中的编号
				{name:'宫保鸡丁', des:'宫保鸡丁选用鸡肉为主料,佐以花生米、黄瓜、辣椒等辅料烹制而成。', price:22, disable:false, mark:0},
				{name:'鱼香肉丝', des:'一道特色传统名菜,以鱼香调味而得名,属川菜。', price:18, disable:false, mark:1},
				{name:'木须肉', des:'木须肉原名木樨肉,是一道常见的特色传统名菜,属八大菜系之一的鲁菜。', price:15, disable:false, mark:2}
			],
			shoppingList:[],  //首先定义一个空数组,用来装入选中的菜品信息
			totalNum: 0,  //初始化购物车菜品总量
			totalPrice: 0  //初始化购物车菜品总价格
		},
		methods:{
			order: function(i){  //点菜函数
				this.totalNum++;
				this.totalPrice+=this.arr[i].price;
				this.arr[i].disable=true;

				//shoppingList数组中追加进菜名 价格 数量 和 *编号(这里编号用来记录哪道菜品,以便后边恢复按钮的可点击状态)
				this.shoppingList.push( {name:this.arr[i].name, price:this.arr[i].price, num:1, mark:this.arr[i].mark });  
			},
			sub: function(i){  //购物车内减少数量函数
				this.shoppingList[i].num--;  //选中菜品数量递减

				if(this.shoppingList[i].num<1){  //判断条件:如果菜品数量被减至小于1时
					this.totalNum--;
					this.totalPrice-=this.shoppingList[i].price;
					this.arr[this.shoppingList[i].mark].disable=false;  //点菜按钮恢复
					this.shoppingList.splice(i,1)  //在shoppingList数组中清除掉数量已经为零的菜品

					return;
				};
				this.totalNum--;  //2-- >1  
				this.totalPrice-=this.shoppingList[i].price;
				console.log(this.shoppingList[i].mark)

			},
			add: function(i){  //购物车内增加数量函数
				this.totalNum++;  //总量递增
				this.shoppingList[i].num++;  //选中菜品数量递增
				this.totalPrice+=this.shoppingList[i].price;  //总价递增
				
			},
			clear: function(){
				this.totalNum=0;
				this.totalPrice=0;
				this.shoppingList=[];  //被选菜品数组清零
				for(var i=0 ; i<this.arr.length ; i++){
					this.arr[i].disable=false;  //所有按钮恢复状态
					console.log(this.arr[i].disabled)
				};
			}
		}
	})
</script>

(个人认为)

比起jQuery,vue用来处理数据转换逻辑更加清晰,代码更加简洁。

转载于:https://my.oschina.net/u/3490747/blog/909891

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值