vue实战案例4-基于组件的购物车案例

在这里插入图片描述

<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>
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值