<template> <mescroll-uni ref="mescrollRef" top="80rpx" @init="mescrollInit" @down="downCallback" @up="upCallback" :down="downOption" :up="upOption"> <view class="collection-list"> <view class="goods-list p-t-20" v-show="type == 1"> <view v-for="(item, index) in collectionList" :key="item.id"> <u-swipe-action :show="selectIndex == item.id" :index="item.id" bg-color="transparent" :btn-width="130" @click="clickBtn" @open="open" :options="options"> <view class="collection-item flex bg-white" @tap="toGoods(item)"> <u-image width="160rpx" height="160rpx" border-radius="6rpx" lazy-load class="m-r-20" :src="item.image" /> <view class="info flex-1"> <view class="flex row-between"> <view class="name line-2">{{item.name}}</view> </view> <view class="flex row-between m-t-20"> <price-format :first-size="30" :second-size="26" :price="item.min_price" :weight="400" :subscript-size="30" :color="colorConfig.primary" /> <view class="btn primary flex row-center br60 sm" :class="{'valid muted': item.is_valid == 0}"> {{ item.is_valid == 0 ? '已失效' : '去购买'}} </view> </view> </view> </view> </u-swipe-action> </view> </view> <view class="store-list" v-show="type == 2"> <view class="m-t-20" v-for="(item, index) in collectionList" :key="item.id"> <u-swipe-action :show="selectIndex == item.id" :index="item.id" bg-color="transparent" :btn-width="130" @click="clickBtn" @open="open" :options="options"> <view class="store-item bg-white flex" @tap="toShop(item)"> <u-image width="80rpx" height="80rpx" border-radius="60rpx" :src="item.logo" /> <view class="flex-1 m-l-10"> <view class="store-name lg"> {{item.name}}<text class="xxs tag white m-l-10 line-1" v-if="item.type == 1">自营</text> </view> <view class="m-t-12 xs muted flex row-between"> 主营行业:{{item.cid_desc}} <view class="xs" v-if="item.score!=0"> 评分: <text style="color: #ffa200"> {{item.score}} </text> </view> </view> </view> <!-- <view class="flex muted xs"> 评分:<view style="color: #FFA200;">{{item.score}}</view> </view> --> </view> </u-swipe-action> </view> </view> </view> </mescroll-uni> </template> <script> import { getCollectGoods, getCollectShop, collectGoods } from '@/api/user' import { changeShopFollow } from '@/api/shop' import MescrollMixin from "@/components/mescroll-uni/mescroll-mixins.js"; import MescrollMoreItemMixin from "@/components/mescroll-uni/mixins/mescroll-more-item.js"; export default { mixins: [MescrollMixin, MescrollMoreItemMixin], name: "collection-list", props: { type: { type: [String, Number] } }, data() { return { collectionList: [], downOption: { auto: false // 不自动加载 (mixin已处理第一个tab触发downCallback) }, upOption: { auto: false, // 不自动加载 noMoreSize: 4, //如果列表已无数据,可设置列表的总数量要大于半页才显示无更多数据;避免列表数据过少(比如只有一条数据),显示无更多数据会不好看; 默认5 empty: { icon: '/static/images/goods_null.png', tip: '暂无收藏~', // 提示 fixed: true } }, options: [{ text: '取消收藏', style: { backgroundColor: '#FF2C3C' } }], selectIndex: -1 }; }, methods: { async upCallback(page) { let pageNum = page.num; // 页码, 默认从1开始 let pageSize = page.size; // 页长, 默认每页10条 let { type, } = this; const { data, code } = type == 1 ? await getCollectGoods({ page_size: pageSize, page_no: pageNum }) : await getCollectShop({ page_size: pageSize, page_no: pageNum }) if (code == 1) { let curPageData = data.lists; let curPageLen = curPageData.length; let hasNext = !!data.more; if (page.num == 1) this.collectionList = []; this.collectionList = this.collectionList.concat(curPageData); this.mescroll.endSuccess(curPageLen, hasNext); } }, toGoods(item) { if (item.is_valid) { this.$Router.push({ path: '/pages/goods_details/goods_details', query: { id: item.id } }) } }, toShop(item) { this.$Router.push({ path: '/pages/store_index/store_index', query: { id: item.id } }) }, open(index) { // 先将正在被操作的swipeAction标记为打开状态,否则由于props的特性限制, // 原本为'false',再次设置为'false'会无效 this.selectIndex = index; // } }, async clickBtn(index) { const { code, data, msg } = this.type == 1 ? await collectGoods({ goods_id: index }) : await changeShopFollow({ shop_id: index }) if (code == 1) { this.$toast({ title: msg }) this.downCallback() } } }, } </script> <style lang="scss"> .collection-list { width: 100%; .goods-list { .collection-item { padding: 20rpx; &:not(:last-of-type) { border-bottom: $-solid-border; } .btn { width: 148rpx; height: 52rpx; border: 1px solid $-color-primary; &.valid { background-color: #f2f2f2; border-color: transparent; } } } } .store-list { margin: 0 20rpx; .store-item { padding: 15rpx 20rpx; border-radius: 16rpx; .store-name {} .tag { background: linear-gradient(267deg, #FF2C3C 0%, #F52E99 100%); border-radius: 6rpx; padding: 0 9rpx; vertical-align: 5rpx; } } } } </style>