const app = getApp(); const { goodsApi, DFSImg, $themeToLink } = app; const componentOptions = { // 组件选项 options: { multipleSlots: true }, behaviors: [], properties: { datas: { type: Object }, datasIndex:{ type: Number }, goodsListIndex:{ type: Number } }, // 组件数据 data: { isPageHidden: false, // 页面是否处于隐藏状态 titleIcon: "", classificationLoadPage: 1, classificationLoadNum: 10, queryProductInfoLoading: false, loading: false, scrollLoading: false, // 滚动加载优化后添加加载动画 finished: false, goodsList:[], storageGoodsList:[], storageDatasList:[], pageSize:10, pageNum:1, pageGoodsList:[], loadingFlag:[], }, // 数据监听器 observers: {}, // 组件生命周期 lifetimes: { created() {}, ready() { this.init(); }, moved() {}, detached() {} }, attached() {}, definitionFilter() {}, // 页面生命周期 pageLifetimes: { // 页面被展示 show() { const { isPageHidden } = this.data; // show事件发生前,页面不是处于隐藏状态时 if (!isPageHidden) { return; } // 重新执行定时器等操作 }, // 页面被隐藏 hide() { this.setData({ isPageHidden: true }); // 清除定时器等操作 }, // 页面尺寸变化时 resize() {} }, // 组件方法 methods: { // setPageDatas(active){ // this.pageGoodsList = wx.getStorageSync('pageGoodsList') // console.log(this.pageGoodsList,active,'active'); // }, init() { let { goodsType, goodsSource, angleSignImg, titleIcon } = this.data.datas.componentData; angleSignImg = DFSImg(angleSignImg,150,150,1); if (titleIcon) { titleIcon = DFSImg(titleIcon); } this.setData({ "data.datas.componentData.angleSignImg": angleSignImg, titleIcon }); console.log(this.data.titleIcon, "----------------------------68"); if (goodsType == 0) { if (goodsSource == "classify") { //商品分类 this.getProductList(1, 1); } else { //指定商品 this.getProductList(2); } } else if (goodsType == 1) { if (goodsSource == "classify") { //商品分类 this.getInterList(1); } else { //指定商品 this.getInterList(2); } } }, getProductList(code, type) { let { goodsList, goodsSort } = this.data.datas.componentData; let { classificationLoadPage, loading, finished, queryProductInfoLoading } = this.data; if (queryProductInfoLoading == true) { return; } this.setData({ queryProductInfoLoading: true }); // type 1初始化 2滚动加载 //分类查 if (code == 1) { if (type == 1) { classificationLoadPage = 1; } else { classificationLoadPage++; loading = true; } this.setData({ classificationLoadPage, loading }); let query = { categoryId: this.data.datas.componentData.categoryId, page: this.showRowNum() ? classificationLoadPage : 1, rows: this.showRowNum() ? this.data.classificationLoadNum : this.getItemNum(), sortColumn: goodsSort, sortType: goodsSort != 2 ? 1 : 0, whetherShowSoldOutGoods: this.data.datas.componentData .whetherShowSoldOutGoods, whetherQueryCollectCount: true, whetherUseVirtualSalesQty: true, whetherUseVirtualCollectCount: true, whetherFindDistributionCommission: this .whetherFindDistributionCommission, whetherFindRecommendedCardFlag: this.data.datas.componentData.vipPrice ? 1 : 0, whetherShowGoodsDefaultTagFlag: this.data.datas.componentData .marketingTag ? 1 : 0, whetherFindMultiShopFlag: 1 }; // 当前页 // 一页多少条 //查询销售数量 //查询收藏数 //是否使用虚拟销售数量 //是否使用虚拟收藏人数 //是否查询商品佣金(0:不查询,1:展示,为空不查佣金) //是否查询会员价 1是 0否 //是否展示营销标签 1是 0否 //是否查询多商户 //商城使用 goodsApi.queryProductInfo(query).then(res => { this.setData({ loading: false, queryProductInfoLoading: false }); if (res.data.code == 200) { let goodsLists = res.data.data.list; if (type == 1) { goodsList = goodsLists; } else { goodsList = [...goodsList, ...goodsLists]; } if (goodsLists && goodsLists.length < 10) { this.setData({ finished: true }); } this.goodsListVal(goodsList, type); } }); } else { // 商品产品详情 let terminalProductIds = goodsList.map(element => { return element.terminalProductId; }); if (terminalProductIds.length == 0) { return; } let briefQuery = { sortColumn: goodsSort, sortType: goodsSort != 2 ? 1 : 0, page: 1, rows: terminalProductIds.length, terminalProductIds: terminalProductIds, whetherShowSoldOutGoods: this.whetherShowSoldOutGoods }; // 当前页 // 一页多少条 this.briefProduct(briefQuery); } }, async briefProduct(query) { await goodsApi.queryBriefProductInfo(query).then(res => { if (res.data.code == 200) { let data = res.data.data.list; let ids = data.map(element => { let goodsList = this.render ? res.data.list : res.data.data.list; return element.terminalProductId; }); let storageIds = wx.getStorageSync('ids') storageIds[this.data.goodsListIndex] = ids wx.setStorageSync('ids',storageIds) let storageDatasList = wx.getStorageSync('storageDatasList') storageDatasList[this.data.goodsListIndex] = this.data.datas.componentData wx.setStorageSync('storageDatasList',storageDatasList) this.moreProduct(true); } }); }, async moreProduct(flag) { // 没有数据了就不再请求了,直接return if (this.data.pageGoodsList.length != 0 && this.data.pageGoodsList[this.data.datasIndex].length == wx.getStorageSync('ids')[this.data.datasIndex].length) return this.setData({ scrollLoading: true }) let terminalProductIds = [] console.log(pageNum,'page-----'); let pageNumList = wx.getStorageSync('pageNumList') let pageNum = null if (flag) { pageNum = pageNumList[this.data.goodsListIndex] terminalProductIds = wx.getStorageSync('ids')[this.data.goodsListIndex].slice((pageNum - 1) * this.data.pageSize,pageNum * this.data.pageSize) pageNum += 1 pageNumList[this.data.goodsListIndex] = pageNum }else{ pageNum = pageNumList[this.data.datasIndex] terminalProductIds = wx.getStorageSync('ids')[this.data.datasIndex].slice((pageNum - 1) * this.data.pageSize,pageNum * this.data.pageSize) pageNum += 1 pageNumList[this.data.datasIndex] = pageNum } wx.setStorageSync('pageNumList',pageNumList) let { vipPrice, marketingTag, whetherFindDistributionCommission, goodsList } = this.data.datas.componentData; let moreQuery = { terminalProductIds, whetherQueryCollectCount: true, //查询收藏数 whetherUseVirtualSalesQty: true, //是否使用虚拟销售数量 whetherUseVirtualCollectCount: true, //是否使用虚拟收藏人数 whetherFindDistributionCommission: whetherFindDistributionCommission, //是否查询商品佣金(0:不查询,1:展示,为空不查佣金) whetherFindRecommendedCardFlag: vipPrice ? 1 : 0, //是否查询会员价 1是 0否 whetherShowGoodsDefaultTagFlag: marketingTag ? 1 : 0, //是否展示营销标签 1是 0否 whetherFindMultiShopFlag: 1 //是否查询多商户 //商城使用 }; goodsApi.queryMoreProductInfo(moreQuery).then(res => { if (res.data.code == 200) { goodsList = res.data.data; this.goodsListVal(goodsList, 1,flag); } }); }, goodsListVal(goodsList, type,flag) { console.log(goodsList, "------------goodsListVal"); goodsList.forEach((item, index) => { item.marketingTag = item.defaultTags ? this.filtermark( item.defaultTags, this.data.datas.componentData.marketingTagList ) : []; item.shopLogoUrl = DFSImg(item.shopLogoUrl); item.loadState = false item.coverImage = DFSImg(item.coverImage, 400, 400, 1); item.productImgUrl = DFSImg(item.productImgUrl, 400, 400, 1); item.minPrice = Number(item.minPrice).toFixed(2); item.qty = Number(item.qty); item.saleQty = item.saleQty ? Number(item.saleQty) : 1; item.totalCollectionCount = Number(item.totalCollectionCount) || 0; item.minPriceAfterRecommendedCardPriceTable = item.minPriceAfterRecommendedCardPriceTable ? Number(item.minPriceAfterRecommendedCardPriceTable) : ""; item.minProductGoodsCommission = item.minProductGoodsCommission ? Number(item.minProductGoodsCommission).toFixed(2) : 0; item.minGoodsSuggestedRetailPrice = item.minGoodsSuggestedRetailPrice ? Number(item.minGoodsSuggestedRetailPrice).toFixed(2) : ""; item.showVipPrice = this.showVipPrice(item, index); item.showVipTag = this.showVipTag(item, index); if (item.saleTime) { item.getSaleTime = 0; item.getSaleTime = this.getSaleTime(item.saleTime); } }); var that = this let pageGoodsList = wx.getStorageSync('pageGoodsList') || [] if (flag) { pageGoodsList[that.data.goodsListIndex].push(...goodsList) }else{ pageGoodsList[that.data.datasIndex].push(...goodsList) console.log(pageGoodsList[that.data.datasIndex],'--pageGoodsList[that.data.datasIndex]') } wx.setStorageSync('pageGoodsList', pageGoodsList); // 获取是否要开启请求拦截 let loadingFlag = wx.getStorageSync('loadingFlag') loadingFlag[that.data.datasIndex] = false wx.setStorageSync('loadingFlag', loadingFlag); that.setData({ pageGoodsList, }) this.setData({ "datas.componentData.goodsList": goodsList, // goodsList loadingFlag, scrollLoading: false, },function () { // that.lazyloading(); // 节点布局方案在组件嵌套层级过深测试无效 // let goodsList = this.data.goodsList // 获取原数据 // goodsList.forEach((item,index)=>{ // wx.createIntersectionObserver().relativeToViewport({bottom: 20}).observe(`.goodsItemIndex${index}`, (ret) => { // // if (ret.intersectionRatio > 0){ // // group[i].show = true // // } // // this.setData({ // 更新数据 // // group // // }) // console.log('1111'); // }) // }) }) if (type == 1) { // 初始化 if (this.selectComponent("#waterfallFlow")) { this.selectComponent("#waterfallFlow").initList(goodsList); } } else { // 滚动加载 if (this.selectComponent("#waterfallFlow")) { this.selectComponent("#waterfallFlow").reLoadPro(goodsList); } } }, // 触发图片加载 lazyloading(){ var that = this console.log(that.data.datasIndex,that.data.goodsListIndex,'datasIndex'); console.log(that.data.pageGoodsList[that.data.datasIndex]); let storageDatasList = wx.getStorageSync('storageDatasList') || [] let { style } = storageDatasList[that.data.datasIndex]; let type = '' if(style == 'list'){ type = 'goods-item' }else{ console.log("不是goods-item"); return } let windowHeight = wx.getSystemInfoSync().windowHeight let pageGoodsList = wx.getStorageSync('pageGoodsList') || [] console.log(that.data.pageGoodsList,pageGoodsList,that.data.datasIndex,'pageGoodsList--loading'); let loadingFlag = wx.getStorageSync('loadingFlag') // 如果所有的商品都加载完成直接return if (loadingFlag[that.data.datasIndex]) { console.log("如果所有的商品都加载完成直接return"); return } let ids = wx.getStorageSync('ids')[that.data.datasIndex] if (ids.length == that.data.pageGoodsList[that.data.datasIndex].length && that.data.pageGoodsList[that.data.datasIndex][that.data.pageGoodsList[that.data.datasIndex].length -1].loadState == true ) { return } wx.createSelectorQuery().selectAll(`.goodsListItemIndex${that.data.datasIndex}>>>.${type}`).boundingClientRect(function(rects){ for (let index = 0; index < rects.length; index++) { if (rects[index].top == 0 && rects[index].bottom == 0 && rects[index].left == 0 && rects[index].right == 0) { break } if (rects[index].top < windowHeight) { pageGoodsList[that.data.datasIndex][index].loadState = true } } that.setData({ pageGoodsList, }) // that.pageGoodsList = pageGoodsList console.log(rects,pageGoodsList[that.data.goodsListIndex], pageGoodsList[that.data.datasIndex],'fff'); wx.setStorageSync('pageGoodsList',pageGoodsList) // 如果当前分页倒数第一张加载完成直接 打开loadingFlag开关并加载下一页数据 if (that.data.pageGoodsList[that.data.datasIndex][that.data.pageGoodsList[that.data.datasIndex].length -1].loadState == true) { loadingFlag[that.data.datasIndex] = true that.setData({ loadingFlag, }) wx.setStorageSync('loadingFlag',loadingFlag) that.moreProduct(false) console.log('load--ok'); } }).exec(); }, getSaleTime(val) { return new Date(val.replace(/-/g, "/")).getTime() - new Date().getTime(); }, getItemNum() { //数量 if ( this.data.datas.componentData.style === "list" && this.data.datas.componentData["goodsSource"] != "assign" ) { //网格模式 if ( this.data.datas.componentData.rowNum * this.data.datas.componentData.columnNum >= this.data.datas.componentData.goodsList.length ) { return this.data.datas.componentData.goodsList.length; } else { return ( this.data.datas.componentData.rowNum * this.data.datas.componentData.columnNum ); } } else { return this.data.datas.componentData.goodsList.length; } }, showRowNum() { return ( this.data.datas.componentData.moreShow == false && this.data.datas.componentData.style == "waterfall" && this.data.datas.componentData.goodsSource == "classify" ); }, filtermark(newlist, marketingTagList) { let list = []; if (newlist.length <= 0) return; if (marketingTagList.length > 0) { marketingTagList.forEach((item, index) => { newlist.forEach((item1, index1) => { if (item1 == item.key) { list.push(item); } }); }); } return list; }, showVipPrice(item, index) { // 索引 0 显示价格 1显示名称 let showFlag = false; let vipPrice = item["minPriceAfterRecommendedCardPriceTable"]; if (vipPrice && Number(vipPrice) < Number(item["minPrice"])) { showFlag = true; } return showFlag; }, showVipTag(item, index) { // 索引 0 显示价格 1显示名称 let showFlag = false; let vipPrice = item["minPriceAfterRecommendedCardPriceTable"]; let showTag = item["recommendedCardMinPricePriceTableName"]; if (vipPrice && showTag && Number(vipPrice) <= Number(item["minPrice"])) { showFlag = true; } return showFlag; }, getScroll(el) { //! 如果不是当前tab页return不执行滚动加载 if (this.data.datasIndex != this.data.goodsListIndex) return; // 是指定分类且不显示查看更多的瀑布流组件滚动加载 let { goodsSource, moreShow, style } = this.data.datas.componentData; console.log('goodsSource, moreShow, style',goodsSource, moreShow, style); this.lazyloading() if ( goodsSource == "classify" && moreShow == false && style == "waterfall" ) { this.selectComponent("#waterfallFlow").getScroll(el); } }, // 分页加载 onLoad() { console.log("---触发分页加载"); this.getProductList(1, 2); }, viewMore(e) { let { goodsType, style, categoryName, categoryId } = this.data.datas.componentData; let linkVal = ""; if (goodsType != 1) { linkVal = `/goods/commodityMenu?categoryName=${categoryName}&categoryId=${categoryId}`; } else { linkVal = `/pointShop/productList?categoryName=${categoryName}&categoryId=${categoryId}`; } app.trackCpn(e, this.data.datas.componentName, 'ViewMore查看更多') $themeToLink({ type: 1, link: linkVal }); } } }; Component(componentOptions);