list.vue 3.65 KB
<template>
    <div class="goods-box" v-infinite-scroll="fetch()" infinite-scroll-disable="disableFetch">
        <ul class="cardlist card-large clearfix">
            <li class="card" v-for="item in products">
                <div class="card-pic">
                    <a href="">
                        <img v-lazy="item.goodsList[0].imagesUrl | resize 372 499" alt="{{item.productName}}">
                    </a>
                </div>
                <div class="card-bd">
                    <h2 class="card-label">
                        <a href="">{{item.productName}}</a>
                    </h2>
                    <span class="good-price" :class="{'old-price': item.marketPrice}" v-if="item.marketPrice">¥ {{item.marketPrice}}</span>
                    <span class="good-price" :class="{'sale-price': item.marketPrice}">¥ {{item.salesPrice}}</span>
                </div>
            </li>
        </ul>
        <p class="cardlist--loading text-center" v-show="inLoading">正在加载...</p>
        <p class="cardlist--end text-center" v-show="atEnd ">--End--</p>
    </div>
</template>
<script>
let $ = require('yoho-jquery');

/**
 *  @example
 *  <List url='' :query='{}' disable-fetch></List>
 *  <List :init-data='{}'></List>
 */

module.exports = {
    props: {

        /* 请求地址 */
        url: {
            type: String,
            required: true
        },

        /* 初始数据, 应该只单次绑定, 然后fetch数据全靠url */
        initData: Array,

        /* 请求参数 */
        query: Object,

        /* 开启滚动加载 */
        disableFetch: Boolean 
    },
    data: function() {
        return {
            state: {
                curPage: 0,
                totalPage: 10
            },
            products: [],
            inLoading: false,
            atEnd: false
        };
    },
    methods: {
        fetch: function() {
            if (this.atEnd) {
                return;
            }
            let self = this;

            this.state.curPage++;
            this.inLoading = true;
            $.ajax({
                url: this.url,
                type: 'POST',
            })
            .done(result => {
                self.$set('products', self.products.concat(result.data.productList));
            })
            .always(() => {
                self.inLoading = false;
                self.atEnd = self.state.curPage === self.state.totalPage;
            });

        }
    },
    created: function() {
        // 有初始数据,用初始数据
        if (this.initData) {
            this.$set('products', this.products.concat(this.initData));
            this.atEnd = true;
        } else if (this.url) {
            this.fetch();
        }
    },
};
</script>
<style>
@import "../../scss/common/color";

.cardlist {
    list-style: none;
    margin: 0;
    padding: 0;
}

.card-large {
    .card {
        float: left;
        width: 372px;
        margin-right: 6px;
        &:nth-child(2n) {
            margin-right: 0;
        }
    }
    .card-pic {
        width: 100%;
        height: 499px;
        a,
        img {
            display: block;
            width: 100%;
            height: 100%;
        }
    }
    .card-bd {
        min-height: 180px;
        margin-left: 30px;
        margin-right: 30px;
        padding-top: 25px;
        text-align: center;
        font-size: 24px;
    }
    .card-label {
        margin: 0 0 10px;
        font-size: inherit;
        font-weight: normal;
    }
}

.good-price {
    color: #b0b0b0;
    margin-right: 10px;
    &:last-of-type {
        margin-right: 0;
    }
    &.old-price {
        text-decoration: line-through;
    }
    &.sale-price {
        color: $red;
    }
}
</style>