408 lines
7.6 KiB
JavaScript
408 lines
7.6 KiB
JavaScript
import {
|
||
fetchGoodsList
|
||
} from '../../../services/good/fetchGoodsList';
|
||
import Toast from 'tdesign-miniprogram/toast/index';
|
||
|
||
const image = 'https://tdesign.gtimg.com/miniprogram/images/example2.png';
|
||
const items = new Array(12).fill({
|
||
label: '标题文字',
|
||
image
|
||
}, 0, 12);
|
||
|
||
const initFilters = {
|
||
overall: 1,
|
||
priceSorts: '',
|
||
soldSorts: '',
|
||
layout: 0,
|
||
};
|
||
|
||
Page({
|
||
data: {
|
||
goodsList: [],
|
||
layout: 0,
|
||
priceSorts: '',
|
||
soldSorts: '',
|
||
overall: 1,
|
||
show: false,
|
||
minVal: '',
|
||
maxVal: '',
|
||
filter: initFilters,
|
||
hasLoaded: false,
|
||
loadMoreStatus: 0,
|
||
loading: true,
|
||
shopGuid: 0,
|
||
|
||
value: 'category',
|
||
list: [{
|
||
value: 'all',
|
||
label: '全部',
|
||
icon: 'home'
|
||
},
|
||
{
|
||
value: 'category',
|
||
label: '分类',
|
||
icon: 'app'
|
||
},
|
||
],
|
||
|
||
sideBarIndex: 1,
|
||
scrollTop: 0,
|
||
categories: [{
|
||
label: '选项一',
|
||
title: '标题一',
|
||
icon: 'app',
|
||
badgeProps: {},
|
||
items,
|
||
},
|
||
{
|
||
label: '选项二',
|
||
title: '标题二',
|
||
icon: 'app',
|
||
badgeProps: {
|
||
dot: true,
|
||
},
|
||
items: items.slice(0, 9),
|
||
},
|
||
{
|
||
label: '选项三',
|
||
title: '标题三',
|
||
icon: 'app',
|
||
badgeProps: {},
|
||
items: items.slice(0, 9),
|
||
},
|
||
{
|
||
label: '选项四',
|
||
title: '标题四',
|
||
icon: 'app',
|
||
badgeProps: {
|
||
count: 6,
|
||
},
|
||
items: items.slice(0, 6),
|
||
},
|
||
{
|
||
label: '选项五',
|
||
title: '标题五',
|
||
icon: 'app',
|
||
badgeProps: {},
|
||
items: items.slice(0, 3),
|
||
},
|
||
],
|
||
},
|
||
|
||
offsetTopList: [],
|
||
pageNum: 1,
|
||
pageSize: 6,
|
||
total: 0,
|
||
|
||
handleFilterChange(e) {
|
||
const {
|
||
layout,
|
||
overall,
|
||
priceSorts,
|
||
soldSorts
|
||
} = e.detail;
|
||
this.pageNum = 1;
|
||
this.setData({
|
||
layout,
|
||
priceSorts,
|
||
soldSorts,
|
||
overall,
|
||
loadMoreStatus: 0,
|
||
});
|
||
this.init(true);
|
||
},
|
||
|
||
generalQueryData(reset = false) {
|
||
const {
|
||
filter,
|
||
keywords,
|
||
minVal,
|
||
maxVal,
|
||
shopGuid,
|
||
priceSorts,
|
||
soldSorts,
|
||
overall
|
||
} = this.data;
|
||
const {
|
||
pageNum,
|
||
pageSize
|
||
} = this;
|
||
// const { priceSorts,soldSorts, overall } = filter;
|
||
const params = {
|
||
goodsSort: 0, // 0 综合,1 价格
|
||
pageNum: 1,
|
||
pageSize: 6,
|
||
shopGuid: shopGuid
|
||
// keyword: keywords,
|
||
};
|
||
|
||
if (priceSorts) {
|
||
params.goodsSort = 1;
|
||
params.goodsSortType = priceSorts === 'desc' ? 1 : 0;
|
||
}
|
||
|
||
if (soldSorts) {
|
||
params.goodsSort = 2;
|
||
params.goodsSortType = soldSorts === 'desc' ? 1 : 0;
|
||
}
|
||
if (overall) {
|
||
params.goodsSort = 0;
|
||
} else {
|
||
// params.goodsSort = 1;
|
||
}
|
||
console.log(minVal, '最小价格');
|
||
params.minPrice = minVal ? minVal : 0;
|
||
params.maxPrice = maxVal ? maxVal : 0;
|
||
if (reset) return params;
|
||
return {
|
||
...params,
|
||
pageNum: pageNum + 1,
|
||
pageSize,
|
||
};
|
||
},
|
||
|
||
async init(reset = true) {
|
||
const {
|
||
loadMoreStatus,
|
||
goodsList = []
|
||
} = this.data;
|
||
const params = this.generalQueryData(reset);
|
||
if (loadMoreStatus !== 0) return;
|
||
this.setData({
|
||
loadMoreStatus: 1,
|
||
loading: true,
|
||
});
|
||
try {
|
||
const result = await fetchGoodsList(params);
|
||
const code = 'Success';
|
||
const data = result;
|
||
if (code.toUpperCase() === 'SUCCESS') {
|
||
const {
|
||
result,
|
||
totalNum = 0
|
||
} = data;
|
||
if (totalNum === 0 && reset) {
|
||
this.total = totalNum;
|
||
this.setData({
|
||
emptyInfo: {
|
||
tip: '抱歉,未找到相关商品',
|
||
},
|
||
hasLoaded: true,
|
||
loadMoreStatus: 0,
|
||
loading: false,
|
||
goodsList: [],
|
||
});
|
||
return;
|
||
}
|
||
|
||
const _goodsList = reset ? result : goodsList.concat(result);
|
||
const _loadMoreStatus = _goodsList.length === totalNum ? 2 : 0;
|
||
this.pageNum = params.pageNum || 1;
|
||
this.total = totalNum;
|
||
this.setData({
|
||
goodsList: _goodsList,
|
||
loadMoreStatus: _loadMoreStatus,
|
||
});
|
||
} else {
|
||
this.setData({
|
||
loading: false,
|
||
});
|
||
wx.showToast({
|
||
title: '查询失败,请稍候重试',
|
||
});
|
||
}
|
||
} catch (error) {
|
||
this.setData({
|
||
loading: false,
|
||
});
|
||
}
|
||
this.setData({
|
||
hasLoaded: true,
|
||
loading: false,
|
||
});
|
||
},
|
||
|
||
onLoad(query) {
|
||
const {
|
||
shopGuid
|
||
} = query;
|
||
this.setData({
|
||
shopGuid: shopGuid,
|
||
});
|
||
|
||
this.init(true);
|
||
|
||
const query2 = wx.createSelectorQuery().in(this);
|
||
const {
|
||
sideBarIndex
|
||
} = this.data;
|
||
|
||
query2
|
||
.selectAll('.title')
|
||
.boundingClientRect((rects) => {
|
||
this.offsetTopList = rects.map((item) => item.top);
|
||
console.log(this.offsetTopList,'123123123');
|
||
this.setData({
|
||
scrollTop: rects[sideBarIndex].top
|
||
});
|
||
})
|
||
.exec();
|
||
},
|
||
|
||
onReachBottom() {
|
||
const {
|
||
goodsList
|
||
} = this.data;
|
||
const {
|
||
total = 0
|
||
} = this;
|
||
if (goodsList.length === total) {
|
||
this.setData({
|
||
loadMoreStatus: 2,
|
||
});
|
||
return;
|
||
}
|
||
this.init(false);
|
||
},
|
||
|
||
handleAddCart() {
|
||
Toast({
|
||
context: this,
|
||
selector: '#t-toast',
|
||
message: '点击加购',
|
||
});
|
||
},
|
||
|
||
tagClickHandle() {
|
||
Toast({
|
||
context: this,
|
||
selector: '#t-toast',
|
||
message: '点击标签',
|
||
});
|
||
},
|
||
|
||
gotoGoodsDetail(e) {
|
||
const {
|
||
index
|
||
} = e.detail;
|
||
const {
|
||
spuId
|
||
} = this.data.goodsList[index];
|
||
wx.navigateTo({
|
||
url: `/pages/goods/details/index?spuId=${spuId}`,
|
||
});
|
||
},
|
||
|
||
showFilterPopup() {
|
||
this.setData({
|
||
show: true,
|
||
});
|
||
},
|
||
|
||
showFilterPopupClose() {
|
||
this.setData({
|
||
show: false,
|
||
});
|
||
},
|
||
|
||
onMinValAction(e) {
|
||
const {
|
||
value
|
||
} = e.detail;
|
||
this.setData({
|
||
minVal: value
|
||
});
|
||
},
|
||
|
||
onMaxValAction(e) {
|
||
const {
|
||
value
|
||
} = e.detail;
|
||
this.setData({
|
||
maxVal: value
|
||
});
|
||
},
|
||
|
||
reset() {
|
||
this.setData({
|
||
minVal: '',
|
||
maxVal: ''
|
||
});
|
||
},
|
||
|
||
confirm() {
|
||
const {
|
||
minVal,
|
||
maxVal
|
||
} = this.data;
|
||
let message = '';
|
||
if (minVal && !maxVal) {
|
||
message = `价格最小是${minVal}`;
|
||
} else if (!minVal && maxVal) {
|
||
message = `价格范围是0-${minVal}`;
|
||
} else if (minVal && maxVal && minVal <= maxVal) {
|
||
message = `价格范围${minVal}-${this.data.maxVal}`;
|
||
} else {
|
||
message = '请输入正确范围';
|
||
}
|
||
if (message) {
|
||
Toast({
|
||
context: this,
|
||
selector: '#t-toast',
|
||
message,
|
||
});
|
||
}
|
||
this.pageNum = 1;
|
||
this.setData({
|
||
show: false,
|
||
// minVal: '',
|
||
// goodsList: [],
|
||
loadMoreStatus: 0,
|
||
// maxVal: '',
|
||
},
|
||
() => {
|
||
this.init();
|
||
},
|
||
);
|
||
},
|
||
|
||
onChange(e) {
|
||
this.setData({
|
||
value: e.detail.value,
|
||
});
|
||
},
|
||
|
||
|
||
// 商品分类
|
||
onSideBarChange(e) {
|
||
const {
|
||
value
|
||
} = e.detail;
|
||
this.setData({
|
||
sideBarIndex: value,
|
||
scrollTop: this.offsetTopList[value]
|
||
});
|
||
},
|
||
onScroll(e) {
|
||
const {
|
||
scrollTop
|
||
} = e.detail;
|
||
const threshold = 50; // 下一个标题与顶部的距离
|
||
|
||
if (scrollTop < threshold) {
|
||
this.setData({
|
||
sideBarIndex: 0
|
||
});
|
||
return;
|
||
}
|
||
|
||
const index = this.offsetTopList.findIndex((top) => top > scrollTop && top - scrollTop <= threshold);
|
||
|
||
if (index > -1) {
|
||
this.setData({
|
||
sideBarIndex: index
|
||
});
|
||
}
|
||
},
|
||
|
||
}); |