<head>
<style>
#mycart{ width: 600px; margin: 0 auto;}
#mycart h2{ text-align: center; height:56px; line-height: 56px; text-align: center; background-color:mediumturquoise;}
#mycart .item{display:flex; padding:20px 0; flex-direction:row; border-bottom: 2px solid mediumturquoise;}
#mycart .item img{ width: 110px;}
#mycart .item .name{ width: 200px; padding-left: 12px;}
#mycart .item .change{ width: 200px; padding-left: 20px;}
#mycart .item .change a{ display:inline-block; width: 26px; height: 26px; line-height: 26px; text-align:center; border:1px solid #e6e6e6; background-color: #f1f1f1; text-decoration:none;}
#mycart .item .num{ width: 60px; height: 30px;}
#mycart .item .del{ font-size:22px; cursor:pointer; color:red;}
#mycart .total{ height: 60px; background-color: orange; color: red; text-align:right; line-height:60px;}
#mycart .total b{ padding: 0 10px;}
</style>
</head>
<body>
<div id="mycart">
<my-cart></my-cart>
</div>
</div>
<script src="js/vue.js"></script>
<script>
var CartTitle={
props:['uname'],
template:`
<h2>{{uname}}的商品</h2>
`
};
var CartList={
props:['list'],
template:`
<div>
<div class="item" :key="item.id" v-for="item in list">
<img :src="item.img" :alt="item.name">
<div class="name">{{item.name}}</div>
<div class="change">
<a href="" @click.prevent='sub(item.id)'>-</a>
<input type="text" class="num" :value='item.num' @blur='changNum(item.id,$event)'>
<a href="" @click.prevent='add(item.id)'>+</a>
</div>
<div class="del" @click='cartdel(item.id)'>X</div>
</div>
</div>
`,
methods:{
cartdel:function(id){
//把id传递给父组件
this.$emit('cart-del',id);
},
changNum:function(id,event){
//用对象的方式传递给父组件
this.$emit('change-num',{
id:id,
type:'change',
num:event.target.value
})
},
sub:function(id){
this.$emit('change-num',{
id:id,
type:'sub'
})
},
add:function(id){
this.$emit('change-num',{
id:id,
type:'add'
})
}
}
};
var CartTotal={
props:['list'],
template:`
<div class="total">总价格:<b>{{total}}</b>元</div>
`,
computed:{
total:function(){
//计算商品的价格
var t=0;
this.list.forEach(element => {
t += element.price*element.num
});
return t;
}
}
};
//全局注册组件 及三个局部子组件
Vue.component('my-cart',{
template:`
<div>
<cart-title :uname='uname'></cart-title>
<cart-list :list='list' @cart-del='delCart($event)' @change-num='changeNum($event)'></cart-list>
<cart-total :list='list'></cart-total>
</div>
`,
components:{
'cart-title': CartTitle,
'cart-list': CartList,
'cart-total': CartTotal
},
methods:{
delCart:function(id){
//根据id删除list中对应的数据
//1.找到id对应数据的索引
var index=this.list.findIndex(item =>{
return item.id==id;
})
//2.根据索引删除对应的数据
this.list.splice(index,1);
},
changeNum:function(val){
//分为三种情况:输入域变更,加号变更,减号变更
if(val.type=="change"){
//根据子组件传递过来的数据更新list中对应的数据
this.list.some(item=>{
if(item.id==val.id){
item.num=val.num;
//终止遍历
return true;
}
})
}else if(val.type=="sub"){
//减一操作
this.list.some(item =>{
if(item.id==val.id){
item.num -= 1;
return true;
}
})
}else if(val.type=="add"){
//加一操作
this.list.some(item =>{
if(item.id==val.id){
item.num += 1;
return true;
}
})
}
}
},
data:function(){
return {
uname:'张三',
list:[
{
id:1,
name:'4K55寸电视',
price:1000,
num:1,
img:'img/a.jpg'
},{
id:2,
name:'5K55寸电视',
price:1000,
num:3,
img:'img/b.jpg'
},{
id:3,
name:'5K65寸电视',
price:1000,
num:1,
img:'img/c.jpg'
},{
id:4,
name:'4K75寸电视',
price:1000,
num:2,
img:'img/d.jpg'
}
]
}
},
});
var vm=new Vue({
el:'#mycart',
data:{
}
})
</script>
</body>
vue实战案例4-基于组件的购物车案例
最新推荐文章于 2024-06-11 12:41:07 发布