商品详情页面

<template lang="html">
<div id="productDetailBox">
<flexbox orient="vertical" :gutter="0">
            <flexbox-item>
                <div class="flex-demo">
                   <scroller lock-x height="-60px" ref="scroller" >
                        <div class="scrollBox">
                            <div class="swiperBox">
                                <swiper :options="swiperHeader">
                                    <swiper-slide v-for="item in detailProList.url ">
                                        <div class="swiperBox_img">
                                            <img :src="item" alt="">
                                        </div>
                                    </swiper-slide>
                                    <div class="swiper-pagination" slot="pagination"></div>
                                </swiper>
                            </div>
                            <div class="rebackBox" @click="closeDetail">
                                <icon name="reback" scale="3"></icon>
                            </div>

                            <div class="inner-box food-box" >
                                <flexbox>
                                    <flexbox-item :span="8" >
                                        <div class="img_box">
                                            <div class="meal-detial">
                                                <span>{{detailProList.date}}</span>
                                                <span class="separation">|</span>
                                                <span>{{detailProList.sellTimeType}}</span>
                                            </div>
                                            <div class="foodNameBox">
                                                <span class="food_color">{{detailProList.name}}</span>
                                            </div>
                                            <div>
                                                <span class="food-font_color"></span>
                                                <span class="food-font food-font_color">{{detailProList.price}}</span>
                                                <span class="food_unit">/份</span>
                                            </div>
                                        </div>
                                    </flexbox-item>
                                    <flexbox-item :span="4" class="pay-number" style="margin-left:0">
                                        <div>
                                            <div class="mealNumber" :class="{disables:detailProList.count==0}">
                                                <span @click="cartMinus(detailProList)" class="changeButton leftButton">-</span>
                                                <span class="changeNumber">{{detailProList.num}}</span>
                                                <span @click="cartAdd(detailProList,2)" class="changeButton rightButton">+</span>
                                            </div>
                                        </div>
                                    </flexbox-item>
                                </flexbox>
                            </div>
                            <div class="send_product">
                                <span><icon name="send" scale="3"></icon></span>
                                <input type="checkbox" id="meals" disabled value="1" v-model="self_mention">
                                <label for="meals">自提取餐</label>
                                <input type="checkbox" id="delivery" disabled value="1" v-model="delivery">
                                <label for="delivery">送货上门</label>
                            </div>
                            <div class="graphic">
                                <divider>图文详情</divider>
                            </div>
                            <div id="detail" class="detailImg_box" v-html="detailProList.description_detail">

                            </div>
                        </div>
                    </scroller>
                </div>
            </flexbox-item>
            <flexbox-item>
                <div class="flex-demo" >
                    <flexbox :gutter="0">
                        <flexbox-item :span="9">
                            <div class="flex-demo menu-box"  @click="toggleShopcart">
                                <span><icon name="cart" :scale="3"></icon></span>
                                <badge :text="shopCart.num" ></badge>
                                <span class="menu-box_money">¥{{shopCart.totalMoney}}</span>
                            </div>
                        </flexbox-item>
                        <flexbox-item>
                            <div class="flex-demo goPay" @click="goToPay">
                                    <span>去结算</span>
                            </div>
                        </flexbox-item>
                    </flexbox>
                </div>
            </flexbox-item>
        </flexbox>
    </div>
</template>

<script>
    import { mapGetters } from 'vuex'
    import { swiper, swiperSlide } from 'vue-awesome-swiper'
    import {Flexbox, FlexboxItem,Scroller,Divider,Badge } from 'vux'
export default {
    components:{
        Flexbox, FlexboxItem,Scroller,Divider,Badge,
        swiper,
        swiperSlide,
    },
    data(){
      return{
          swiperHeader: {
              spaceBetween: 30,
              centeredSlides: true,
              autoplay: {
                  delay: 2500000,
                  disableOnInteraction: false
              },
              pagination: {
                  el: '.swiper-pagination',
                  clickable: true
              },
              delivery:"",
              self_mention:"",
          },
      }
    },
    computed:{
        ...mapGetters([
            "showDetailFood",
            "detailProList",
            "shopCart",
            "cartStyle",
        ]),
    },
    watch: {
        // 深度 watcher
        detailProList: {
            handler: function (val, oldVal) {
                let self = this
                setTimeout(()=>{
                    let imgs = document.getElementById("detail").getElementsByTagName("img")
                    for (let i in imgs) {
                        if (typeof imgs[i] === 'object'){
                            imgs[i].onload = function () {
                                console.log('img onloaded')
                                self.$refs.scroller.reset()
                            }
                        }
                    }
                    this.$refs.scroller.reset()
                },100)
            },
            deep: true
        }
    },
    created(){
        this.getMealWay()
        this.getStorage()
    },
    methods: {
        getStorage(){
            let cartStorage = JSON.parse(window.sessionStorage.getItem('shopCart'))
            if(cartStorage){
                this.$store.commit("saveShopCart",cartStorage)
            }
        },
        goToPay(){
            if(this.shopCart.num==0){
                this.$vux.toast.show({
                    text: "请选择商品",
                    type:'warn'
                })
                return
            }
            this.$router.push({path:'/account'})
        },
        toggleShopcart(){
            if(this.shopCart.num==0){
                this.showShopcart=false
                return
            }
            this.$store.dispatch("showCart")
            if(this.cartStyle=="2"){
                document.getElementById("all-order").setAttribute('style','bottom:60px')
            }else{
                document.getElementById("all-order").setAttribute('style','bottom:120px')
            }
        },
        closeDetail(){
            this.$store.dispatch("showDetailFood")
            this.$store.commit('controlCartStyle',"1")
        },
        cartMinus(item){
            this.$store.dispatch("minusCart", item)
        },
        cartAdd(item,module){
            if(module==2&&item.count==0){
                return
            }
            if(item.count==0){
                this.$vux.alert.show({
                    content: '商品已售罄',
                })
                return
            }
            this.$store.dispatch("addCart", item)
        },
        getMealWay(){
            this.$http.get('/shop/api/get-mall-delivery-type').then((response) => {
                let res = response.data;
                if (res.status == 1) {
                    this.delivery=Number(res.data.delivery)
                    this.self_mention=Number(res.data.self_mention)
                    this.$store.commit('delivery', res.data.delivery)
                    this.$store.commit('selfMention', res.data.self_mention)
                }
                else{
                    this.$vux.toast.show({
                        text: res.message,
                        type: 'cancel'
                    })
                }
            }).catch((error)=>{
                this.$vux.toast.show({
                    text: "网络异常",
                    type:'cancel'
                })
            })
        },
    },
}

</script>

<style lang="less" >
    #productDetailBox{
        z-index: 4;
        width: 100%;
        height: 100%;
        position: absolute;
        top: 0;
        background: white;
        .mealNumber{
            border:1px solid #a9a8a8bd;
            max-width: 101px;
            height: 30px;
            span{
                display: inline-block;
            }
            .changeButton{
                width: 30px;
                line-height:30px;
                text-align: center;
            }
            .leftButton{
                border-right: 1px solid #cccccc;
                color: #292727;
                font-size: 22px;
                font-weight: bold;
            }
            .rightButton{
                border-left: 1px solid #cccccc;
                color: #292727;
                font-size: 22px;
                font-weight: bold;
            }
            .changeNumber{
                text-align: center;
                line-height: 30px;
                width: 30px;
            }
        }
        .img_box{
            padding: 10px;
            .foodNameBox{
                .food_color{
                    color: #c0c0c0;
                }
            }
        }
        .rebackBox{
            display: inline;
            position: absolute;
            top: 10px;
            left: 20px;
            z-index: 2;
        }
        .send_product{
            padding: 5px 15px;
            span{
                display: inline-block;
                vertical-align: middle;
                padding-right: 20px;
            }
            label{
                padding-right: 20px;
                color: #5a5252;
            }
        }
        .graphic{
            background: #f2f2f2;
            .vux-divider{
                margin: auto;
                font-size: 20px;
            }
            .vux-divider:after, .vux-divider:before{
                width: 37%;
            }
        }
    }
</style>

猜你喜欢

转载自www.cnblogs.com/MR-cui/p/8919099.html