You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

251 lines
6.2 KiB

<template>
<view class="wanlshop-product-container" :style="{ height: `${windowHeight}px` }">
<view class="wanlshop-product-container__bar">
<view class="list">
<view class="item" :class="{ active: filterIndex === 0 }" @tap="handleBarTab(0)">综合</view>
<view class="item" :class="{ active: filterIndex === 1 }" @tap="handleBarTab(1)">销量</view>
<view class="item" :class="{ active: filterIndex === 2 }" @tap="handleBarTab(2)">新上架</view>
<view class="item" :class="{ active: filterIndex === 3 }" @tap="handleBarTab(3)">
<view>价格</view>
<view class="box">
<text :class="{ active: priceOrder === 1 && filterIndex === 3 }" class="wlIcon-sheng" />
<text :class="{ active: priceOrder === 2 && filterIndex === 3 }" class="wlIcon-jiang" />
</view>
</view>
</view>
<view class="text-30 text-bold" @tap="handleListStyle">
<text class="wlIcon-listing-jf" v-if="listStyle === 'col-2-10'"></text>
<text class="wlIcon-liebiao" v-else></text>
</view>
</view>
<scroll-view
:style="{ height: `${windowHeight - 40}px`}"
scroll-y
enable-back-to-top
enable-flex="true"
@scrolltoupper="handleUpper"
@scrolltolower="handleLower">
<wanl-product v-if="dataList.length > 0" :dataList="dataList" :dataType="params.type" :dataStyle="listStyle"/>
<wanl-empty v-if="dataList.length === 0 && status !=='loading'" :text="empty"/>
<uni-load-more :status="status" :content-text="contentText" />
<view :style="{ height: `${tabbarHeight}px`}"/>
</scroll-view>
</view>
</template>
<script>
export default{
name: "wanlShopProduct",
props: {
tabbarHeight: {
type: Number,
default: 0
},
windowHeight: {
type: Number,
default: 0
},
tabId: {
type: String,
default: ""
},
option: {
type: Object,
default () {
return {}
}
}
},
data(){
return{
filterIndex: 0,
priceOrder: 0, // 1 价格从低到高 2价格从高到低
listStyle: 'col-2-10',
dataList: [], // 数据
empty: '',
params: {
search: '',
sort: 'weigh',
order: 'asc',
page: 1,
filter: {},
op: {},
type: 'goods'
},
last_page: 1, //总页码
status: 'loading',
contentText: {
contentdown: '下拉加载更多',
contentrefresh: '疯狂加载中...',
contentnomore: ''
}
}
},
mounted() {
if(this.tabId === 'goods'){
this.initialize(this.tabId);
}
},
methods:{
initialize(type){
this.params.type = type === 'groups' ? 'groups':'goods';
// 判断是否类目搜索
if(this.option.category_id){
this.params.filter.shop_category_id = this.option.category_id;
this.params.op.shop_category_id = 'FIND_IN_SET';
this.loadData();
if (this.dataList.length === 0) {
this.empty = `没有查询到相关宝贝,以下为您推荐猜你喜欢的商品~`;
}
}else{
this.params.filter.shop_id = this.option.shop_id;
this.params.op.shop_id = 'in';
if(type === 'news'){
this.params.sort = 'createtime';
}
this.loadData();
if (this.dataList.length === 0) {
this.empty = '暂时没有在店铺内找到任何产品,请搜索查询~';
}
}
},
async loadData(type) {
this.status = 'loading';
// 判断上拉还是下拉
if(type === 'upper'){
this.params.page = 1;
}else if(type === 'lower'){
if (this.params.page >= this.last_page) {
this.status = 'noMore';
return false;
} else {
this.params.page += 1;
}
}
// 请求数据
await this.$api.get({
url: '/wanlshop/product/lists',
loadingTip: '加载中...',
data: this.params,
success: res => {
if(type === 'lower'){
this.dataList = this.dataList.concat(res.data);
}else{
this.dataList = res.data;
}
this.params.page = res.current_page; //当前页码
this.last_page = res.last_page; //总页码
// 判断是否还有数据
if(res.current_page === res.last_page || res.total === 0){
this.status = 'noMore';
}else{
this.status = 'more';
}
}
});
},
handleUpper() {
// this.loadData('upper');
},
handleLower() {
this.loadData('lower');
},
handleListStyle(){
if (this.listStyle == 'col-1-10') {
this.listStyle = 'col-2-10';
} else {
this.listStyle = 'col-1-10';
}
},
handleBarTab(index){
if (this.filterIndex === index && index !== 3) {
return;
}
this.filterIndex = index;
if (index === 3) {
this.priceOrder = this.priceOrder === 1 ? 2 : 1;
} else {
this.priceOrder = 0;
}
// 排序方式
if (index === 0) {
this.params.sort = 'weigh';
this.params.order = 'asc';
}
if (index === 1) {
this.params.sort = 'sales';
this.params.order = 'asc';
}
if (index === 2) {
this.params.sort = 'createtime';
this.params.order = 'asc';
}
if (index === 3 && this.priceOrder === 1) {
this.params.sort = 'price';
this.params.order = 'asc';
}
if (index === 3 && this.priceOrder === 2) {
this.params.sort = 'price';
this.params.order = 'desc';
}
this.status = 'loading';
this.params.page = 1;
this.loadData();
uni.pageScrollTo({
duration: 300,
scrollTop: 0
});
}
},
watch: {
tabId(newVal, oldVal) {
if (newVal === 'news' || newVal === 'groups') {
this.dataList = [];
this.initialize(newVal);
}
}
}
}
</script>
<style lang="scss">
.wanlshop-product-container{
background-color: #f9f9f9;
border-radius: 30rpx 30rpx 0 0;
&__bar{
display: flex;
align-items: center;
justify-content: space-between;
padding: 0 30rpx;
height: 40px;
overflow: hidden;
color: #555;
.list{
width: 75%;
display: flex;
align-items: center;
justify-content: space-between;
.item{
display: flex;
align-items: center;
&.active{
color: #f40;
font-weight: bold;
}
.box{
color: #ccc;
margin-top: 2rpx;
margin-left: 8rpx;
display: flex;
flex-direction: column;
line-height: 1;
.active{
color: #f40;
}
}
}
}
}
}
</style>