Files
2025-11-17 14:11:46 +08:00

143 lines
3.6 KiB
JavaScript

import { getCategoryList } from '../../services/good/fetchCategoryList';
import { fetchGoodsList } from '../../services/good/fetchGoodsList';
Page({
data: {
list: [],
goodsList: [],
hasLoaded: false,
loadMoreStatus: 0,
categoryId: '',
categoryName: '',
},
pageNum: 1,
pageSize: 30,
total: 0,
async init() {
try {
const result = await getCategoryList();
this.setData({
list: result,
});
} catch (error) {
console.error('err:', error);
}
},
onShow() {
this.getTabBar().init();
},
onChange(e) {
const { item, source } = e.detail;
let categoryId = item.groupId || item.categoryId || '';
const categoryName = item.name || '';
// 兼容“全部”按钮的 groupId: `${id}_all`
if (categoryId && categoryId.toString().endsWith('_all')) {
categoryId = categoryId.toString().replace('_all', '');
}
// 二级分类:跳转到商品列表页;一级分类:当前页加载数据
if (source === 'child') {
const url = `/pages/goods/list/index?categoryId=${encodeURIComponent(categoryId)}&categoryName=${encodeURIComponent(categoryName)}`;
wx.navigateTo({ url });
return;
}
// 一级分类只在当前页加载商品
this.pageNum = 1;
this.setData({ categoryId, categoryName, loadMoreStatus: 0 });
this.loadCategoryGoods(true);
},
// 组装查询参数
buildQueryParams(reset = true) {
const params = {
pageNum: reset ? 1 : this.pageNum + 1,
pageSize: this.pageSize,
category_id: this.data.categoryId || undefined,
};
return params;
},
async loadCategoryGoods(reset = true) {
const { loadMoreStatus, goodsList = [] } = this.data;
if (loadMoreStatus !== 0) return;
const params = this.buildQueryParams(reset);
this.setData({ loadMoreStatus: 1 });
try {
const result = await fetchGoodsList(params);
if (!result || !result.spuList) {
this.setData({ hasLoaded: true, loadMoreStatus: 0 });
return;
}
const { spuList, totalCount = 0 } = result;
const merged = reset ? spuList : goodsList.concat(spuList);
const status = merged.length === totalCount ? 2 : 0;
this.pageNum = params.pageNum || 1;
this.total = totalCount;
this.setData({
goodsList: merged,
loadMoreStatus: status,
hasLoaded: true,
});
} catch (error) {
console.error('获取分类商品失败:', error);
this.setData({ loadMoreStatus: 0, hasLoaded: true });
}
},
onReachBottom() {
const { goodsList } = this.data;
const total = this.total || 0;
if (goodsList.length >= total && total > 0) {
this.setData({ loadMoreStatus: 2 });
return;
}
this.loadCategoryGoods(false);
},
handleAddCart() {
wx.showToast({ title: '点击加购', icon: 'none' });
},
onLoad() {
this.init(true);
},
// 分享功能
onShareAppMessage() {
return {
title: '商品分类 - 浏览更多精选商品',
path: '/pages/category/index'
};
},
// 分享到朋友圈
onShareTimeline() {
return {
title: '商品分类 - 浏览更多精选商品'
};
},
handleClickGoods(e) {
const { index } = e.detail || {};
const { goodsList = [] } = this.data;
const item = goodsList[index];
const spuId = item && (item.spuId || item.id || item.skuId);
if (!spuId) {
wx.showToast({ title: '无法识别商品ID', icon: 'none' });
return;
}
wx.navigateTo({
url: `/pages/goods/details/index?spuId=${encodeURIComponent(spuId)}`
});
},
});