diff --git a/pages_goods/public/js/detail.js b/pages_goods/public/js/detail.js index 3ccc7dc..1d04d5d 100644 --- a/pages_goods/public/js/detail.js +++ b/pages_goods/public/js/detail.js @@ -181,7 +181,10 @@ export default { this.chatRoomParams = { sku_id: this.goodsSkuDetail.sku_id }; - let typeId = this.goodsSkuDetail.goods_promotion[0]; + // 鸿蒙兼容: 后端在部分场景下可能不返回 goods_promotion, 缺字段直接 .[0] 会抛 TypeError, + // 整个 onShow 走 catch 路径无法关闭骨架屏, 表现为"数据已回来但永远显示骨架屏" + const promotionList = this.goodsSkuDetail?.goods_promotion || []; + let typeId = promotionList.length > 0 ? promotionList[0] : undefined; if (typeId) { // 限时折扣 if (typeId.discount_id) { @@ -199,18 +202,21 @@ export default { // 兼容鸿蒙元服务: $nextTick 在某些 JSVM 实现下不可靠, 用 setTimeout 兜底 // #ifdef MP-HARMONY await new Promise(resolve => setTimeout(resolve, 16)); + // 修复鸿蒙元服务: 不依赖 setTimeout 关闭骨架屏. + // 鸿蒙 JSVM 在 onShow 早期窗口的 setTimeout 回调有时被推迟/丢弃, 表现为"数据已回来但永远显示骨架屏". + // 数据已赋值 + 首屏让步, 同步直接关闭骨架屏, 由 hasRealData 兜底避免空详情. + this.loading = false; // #endif // #ifndef MP-HARMONY await this.$nextTick(); - // #endif - // 关闭商品详情骨架屏: 在真实数据首屏渲染完成后再隐藏骨架屏, // 用户会看到骨架屏 → 真实详情 的清晰过渡 // 最短展示 300ms: 数据请求很快时也保留足够感知时间, 否则一闪而过用户根本看不到骨架屏 setTimeout(() => { this.loading = false; }, 300); + // #endif // 处理商品数据 (同步字段变换 + 后台并发 getGoodsForm) await this.handleGoodsSkuData();