tabBox.vue 6.87 KB
<template>
  <div class="tabBox">
      <!-- 主内容区域 -->
      <van-tabs @change="onChange" swipeable v-model="active">
          <van-tab v-for="(item,index) in tabbar" :key="index" :title="item.title">

          </van-tab>
          <div class="tabBox_main"  ref="tabsSwiperBox">
              <div class="tabbar" v-for="(item, index) in tabbaromponents.ads" :key="index">
                  <!-- 关爱屋简介 -->
                  <div class="skeleton brief" ref="brief">
                      <html-box
                          v-if="item.style === '14'"
                          :htmls="item.content">
                      </html-box>
                  </div>
                  <!-- 精品推荐 -->
                  <div class="skeleton boutique" ref="boutique">
                      <img-list-box
                          v-if="item.style === '12'"
                          @detail="toDetail"
                          :imgLists="item.img">
                      </img-list-box>
                      <!--优惠专区-->
                      <discountZone v-if="item.style == '1'" @more="toDetail" @toDetail="toDetail"
                                    :discountZoneInfo="item">
                      </discountZone>
                  </div>
                  <!-- 商品推荐 -->
                  <div class="skeleton commodity" ref="commodity">
                      <!--infinite-scroll-immediate-check="true"可避免上拉多次调用接口问题-->
                      <div class="column-commodity-list" infinite-scroll-immediate-check="true" v-infinite-scroll="loadCommodity" infinite-scroll-disabled="paging.commodity.loading" :infinite-scroll-distance="paging.distance">
                          <column-commodity-list-box
                              v-if="item.style === '15'"
                              @detail="toCommodityDetail"
                              :columnLists="commoditys">
                          </column-commodity-list-box>
                      </div>
                  </div>
              </div>
          </div>
      </van-tabs>
  </div>
</template>

<script>
    import { Toast, Indicator } from "mint-ui";
    import htmlBox from "@/components/htmlBox/htmlBox";
    import imgListBox from "@/components/imgListBox/imgListBox";
    import columnCommodityListBox from "@/components/columnCommodityListBox/columnCommodityListBox";
    import discountZone from "@/components/discountZone/discountZone";
  export default {
    name: 'name',
    data () {
      return {
          active: 0,
          tabbaromponents: null, // 组件库
          commoditys: {               // 全部推荐
              list: []
          },
          paging: {                   // 分页
              commodity: {
                  loading: true,
                  page: 1
              },
              distance: 50
          }
      }
    },
    props:["tabbar"],
    components: {
        htmlBox,
        imgListBox,
        columnCommodityListBox,
        discountZone
    },
    created(){
        // 初始化的时选中关爱屋
        this.tabbaromponents = this.tabbar.find((item)=>{
            return item.title === "关爱屋"
        });
        // 获取爱心屋全部商品数据
       this.shopRecommendGoods(this.paging.commodity.page)
    },
    methods: {
        onChange(name, title) {
            // 切换tab时判断展示哪个组件
            this.tabbaromponents = this.tabbar.find((item)=>{
                return item.title === title
            });
        },
        /**
         * 调用通用跳转
         * @param {object} item [通用跳转对象]
         */
        toDetail(item) {

            // 判断是否有通用跳转函数
            if (typeof this.$parent.gotoDetail === "function") {

                // 调用通用跳转
                this.$parent.gotoDetail(item);
            }
        },
        /**
         * 特定跳转商品详情
         * @param {object} item [跳转对象]
         */
        toCommodityDetail(item) {

            // 设置跳转参数
            Object.assign(item, {
                type: "2",
                to: item.id
            });

            // 调用通用跳转
            this.toDetail(item);
        },
        /**
         * 爱心屋项目全部商品
         * @param {int} page [页码]
         */
        shopRecommendGoods(page) {
            // 判断必要参数
            if (this.tabbar[2].shop_id) {

                // 加载中
                this.$set(this.paging.commodity, "loading", true);

                // 加载中提示
                Indicator.open('加载中...');

                // 请求接口
                this.http("/Api/" + (this.getApiVersion().index) + "/shopGoodsList", {
                    shop_id: this.tabbar[2].shop_id,
                    page: page
                }, this.shopRecommendGoodsCallback, {
                    method: "POST"
                });
            }
        },

        /**
         * 爱心屋项目全部商品回调
         * @param {object} res [服务器返回数据]
         * @param {object} ext [扩展参数]
         */
        shopRecommendGoodsCallback(res, ext) {
            // 加载完成
            Indicator.close();

            // 返回处理
            if (res.code == 200) {

                // 解构数据
                let {data: datas} = res;

                /* 设置商品推荐数据 开始 */

                // 判断是否有数据
                if (datas && datas.length) {

                    // 追加列表
                    this.$set(this.commoditys, "list", [...this.commoditys.list, ...datas]);

                    // 设置还有需要加载的内容
                    this.$set(this.paging.commodity, "loading", false);
                } else {

                    // 没有需要加载的内容,停止上拉加载
                    this.$set(this.paging.commodity, "loading", true);
                }

                /* 设置商品推荐数据 结束 */

            } else if (res.code == 400) {

                // 获取商品推荐失败
                Toast(res.message);
            } else {

                // 获取商品推荐失败
                Toast("获取商品推荐失败");
            }
        },
        /**
         * 上拉加载“爱心屋项目全部商品”
         */
        loadCommodity() {
            // 判断是“精品推荐”页才加载
            if (this.tabbaromponents.title === '全部商品' && this.tabbaromponents.shop_id) {
                    // 设置“精品推荐”页码
                    this.$set(this.paging.commodity, "page", ++this.paging.commodity.page);
                    // 调用接口
                    this.shopRecommendGoods(this.paging.commodity.page);
            }
        },

    }
  }
</script>

<!-- Add "scoped" attribute to limit CSS to this component only -->
<style rel="stylesheet/less" lang="less">
    @import './tabBox';
</style>