數量加減組件學習

關於加/減組件及價格計算
實現效果:
clipboard.png
(一)cartControl.vue組件

clipboard.png
初始狀態只顯示+,點擊+號,food(類自父組件)set一個新屬性count,同時顯示數量,出現-號部分
<template>
<div class="cartControl">

<!--減號區 s--->
<transition name="fade">
    <div class="cart-decrease" v-show="food.count>0" @click.stop.prevent="decreaseCart($event)">
        <transition name="inner">
            <span class="inner iconfont icon-jian"></span>
        </transition>
    </div>
</transition>
<!--減號區 e--->
<!--商品數量區 s--->
<span class="cart-count" v-show="food.count>0">
    {{food.count}}
</span>
<!--商品數量區 e--->
<!--加號區 s--->
<span class="iconfont icon-jia cart-add" @click.stop.prevent="addCart($event)">
</span>
<!--加號區 e--->

</div>
</template>
JS部分:
<script>

export default{
    props:{
        food:{
            type:Object
        }
    },
    methods:{
       //點擊加號執行的事件
       addCart(event){
            //去除引入better-scroll自帶的事件點擊
           if(!event._constructed){
               return;
           }
           //初始狀態下,food.count是不存在的
           if(!this.food.count){
               //給food對象新增一個count屬性,初始值爲1
               Vue.set(this.food,'count',1);
           }
           else{
               //如果count的值存在
               //點擊加號的時候,每次count值加1
               this.food.count++;
           }
       },
       decreaseCart(event){
           //去除引入better-scroll自帶的點擊事件
           if(!event._constructed){
               return;
           }
           //點擊減號時候,food.count每次減一
           this.food.count--;
       }
      
    
    }
}

</script>
(二)shopCart.vue組件

clipboard.png

價格及菜品顯示部分
<template>

<div>
    <div class="shopCart">
        <!--點擊黑色區域出現詳情列表 s--->
        <div class="content" @click="toggleList($event)">
            <!--left s--->
             <div class="content-left">
                  <!--購物車圖標 s--->
                  <div class="logo-wrapper">
                      <!--totalCount>0(有添加菜品) logo添加hightlight
                      即選中的狀態爲藍色背景--->
                      <div class="logo" :class="{'highlight':totalCount>0}">
                          <i class="iconfont icon-gouwuche" :class="{'highlight':totalCount>0}"></i>
                      </div>
                      <!--已選擇的商品數量 s--->
                      <div class="num" v-show="totalCount>0">
                         {{totalCount}} 
                      </div>
                      <!--已選擇的商品數量 e--->
                  </div>
                  <!--購物車圖標 e--->
                  <!-- 價格 s -->
                  <div class="price" :class="{'highlight':totalPrice>0}">
                      ¥{{totalPrice}}
                  </div>
                  <!-- 價格 e -->
                  <!-- 配送費 s -->
                  <div class="desc">
                      另需配送費¥{{deliveryPrice}}
                  </div>
                  <!-- 配送費 e -->
             </div>    
            <!--left e--->
            <!--右側顯示起送價 s--->
            <div class="content-right">
                <div class="pay" :class="payClass" @click.stop.prevent="pay">
                    {{payDesc}}
                </div>
            </div> 
            <!--右側顯示起送價 e--->
        </div>
        <!--點擊黑色區域出現詳情列表 e--->
        <!--菜品列表 s--->
        <transition name="fade">
            <div class="shopcart-list" v-show="listShow">
                <!--header s--->
                <div class="list-header">
                    <h1 class="title">購物車</h1>
                    <span class="empty" @click="empty">清空</span>
                </div>
                <!--header e--->
                <!--列表 s--->
                <div class="list-content" ref="listContent">
                    <ul>
                        <li class="shopcart-food" v-for="food in selectFoods">
                            <span class="name">{{food.name}}</span>
                            <div class="price">
                                <span>¥{{food.price * food.count}}</span>
                            </div>
                            <div class="cartControl-wrapper">
                                <!---引入cartControl.vue組件--->
                                <cartControl :food="food"></cartControl>
                            </div>
                        </li>
                    </ul>
                </div>
                <!--列表 e-->
            </div>
        </transition>
        <!--菜品列表 e--->
    </div>
</div>
**JS部分:**

goods父組件中:

clipboard.png

clipboard.png
goods.vue中的seller來自於home組件

clipboard.png

<script>
    import BScroll from "better-scroll";
    import cartControl from "../component/cartControl.vue";
    export default{
        components:{
            cartControl
        },
        props:{
            //接收來自父組件的selectFoods
            selectFoods:{
                type:Array,
                //設置default,保證你需要用到該屬性的時候不會undefined
                default(){
                    return [
                        {
                            price:20,
                            count:2
                        }
                    ];
                
                }
            },
            //接收來自父組件的配送費
            deliveryPrice:{
                type:Number,
                default:0
            },
            //接收來自父組件的minPrice
            minPrice:{
                type:Number,
                default:0
            }
            
        },
        data(){
            return {
                fold:true
            }
        },
        computed:{
            //totalCount,選中的菜品總數
            totalCount(){
                let count=0;
                //選中的食物selectFoods來自於父組件
                this.selectFoods.forEach(food=>{
                    count+=food.count;
                })
                return count;
            
            },
            //總價格
            totalPrice(){
                let total=0;
                this.selectFoods.forEach(food=>{
                    total+=food.price * food.count
                });
                return total;
            },
            //payClass定義
            payClass(){
                //若總價小於最小价格要返回的class
                if(this.totalPrice<this.minPrice){
                    return "not-enough"
                }
                else{
                    return "enough"
                }
            },
            //起送描述
            payDesc(){
                if(this.totalPrice===0){
                    return `¥${this.minPrice}元起送`
                }
                else if(this.totalPrice<this.minPrice){
                    return `還差¥${diff}元起送`;
                }
                else{
                
                    return "去結算"
                }
            
            },
            //控制菜品列表的顯示
            listShow(){
                //是否顯示由fold決定,fold的值由toggleList決定
                if(!this.totalCount){
                    //fold爲true,列表不顯示,是摺疊的狀態
                    this.fold=true;
                    return false;
                }
                let show=!this.fold;
                if(show){
                    this.$nextTick(()=>{
                        //列表展示的情況下爲其初始化爲可滑動
                        if(!this.scroll){
                            this.scroll=new BScroll(this.$refs.listContent,{
                                click:true
                            });
                        }
                        else{
                            this.scroll.refresh();
                        
                        }
                    
                    });
                    
                }
                return show;
            
            }
        
        
        },
        methods:{
            //點擊去結算執行的方法
            pay(){
                if(this.totalPrice<this.minPrice){
                    return;
                }
                window.alert("支付"+this.totalPrice+"元")
            
            },
            //列表切換:
            toggleList(){
                if(!this.totalCount){
                    return;
                }
                this.fold=!this.fold;
            },
            empty(){
                this.selectFoods.forEach(food=>{
                    food.count=0;
                })
            }
        
        
        }
    }
</script>

</template>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章