(二)VUE列表渲染、简易购物车原理

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
	<script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
</head>
<style type="text/css">
	.shouqing{
		color:#ccc;
	}
	a{
		color: inherit;
	}
</style>
<body>
	<div id="app">
		<ul>
			<li v-for="pro in products" :key="pro.id" :class="{shouqing: pro.count === 0}">
				<input type="checkbox" :value="pro.tit" v-model="check" :disabled="pro.count === 0">
				<input type="text" v-model.number="pro.count" :disabled="pro.count === 0">
				<input type="button" value="-" :disabled="pro.count === 0" @click="countSub(pro, $event)">
				{{pro.tit}}
				<span v-if="pro.count === 0">售罄!</span>
				<input type="button" value="+" :disabled="pro.count === 0" @click="countAdd(pro, $event)">
				 <i>{{pro.price}}</i> 
				小计:<em>{{(pro.price*pro.count).toFixed(2)}}</em>
				<a href="" @click.prevent="deletePro(pro)">删除</a>
			</li>
		</ul>
		全选:<input type="checkbox" @click="allCheck" > 合计:<span>{{totalPrice.toFixed(2)}}</span>
		<div>sum:{{calcSum}}</div>
		
	</div>

</body>
<script>

	var app = new Vue({
		el: "#app",
		data: {
			products: [{
				id: 0, tit: "Lebron James", count: 0, price: 9.9
			},{
				id: 1, tit: "Anthony", count: 5, price: 9.8
			},{
				id: 2, tit: "wade", count: 9, price: 6.6
			},{
				id: 3, tit: "Jordan", count: 3, price: 7.9
			}],
			check: ['Anthony']
		},
		computed: {
			calcSum(){
				return this.products.reduce((total, curr)=>{
					return total + curr.count;
				}, 0)//传递给函数的初始值,意思就是total初始设为0,不过不指定第二个参数,则total初始值为数组中第一项的值
			},
			totalPrice(){
				return this.products.reduce((price, curr)=>{
					return price + curr.price * curr.count
				}, 0)
			}
		},
		methods: {
			countAdd(pro){
				pro.count++
			},
			countSub(pro, e){
				pro.count--
				if(pro.count === 1){
					e.target.disabled = true;
				}
			},
			allCheck(e){
				if(e.target.checked === true){
					return this.products.reduce((re, v)=>{
						if(this.check.indexOf(v.tit) === -1)//数组中有的tit就不push了
							return this.check.push(v.tit);
					}, 0)
				}else{
					this.check = [];
				}
			},
			deletePro(pro){
				this.products.splice(this.products.indexOf(pro), 1)
			}
		},
		watch: {
		    products: {
		    	handler(currval, nextval){ //监听到变化时应该执行的函数。参数第一个是改变后的值(原数据),第二个是改变后的值的深拷贝。 
		    		// console.log(currval == nextval)//false
		    		// console.log(currval == this.products)//true
		    		// console.log(nextval == this.products)//false
			    },
				deep: true,//其值是true或false;确认是否深入监听。(一般监听时是不能监听到对象属性值的变化的,数组的值变化可以听到。)
				immediate: true//其值是true或false;确认是否以当前的初始值执行handler的函数。
		    }

		},
		updated(){
			console.log("update",this.check)
		}
	})
</script>
</html>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值