From 5b7351dcd2be3e80f8ee7fc1054e08b450044d82 Mon Sep 17 00:00:00 2001
From: ZF sun <34314687@qq.com>
Date: Sat, 18 Jul 2026 17:54:05 +0800
Subject: [PATCH] =?UTF-8?q?fix:=20=E5=85=BC=E5=AE=B9=E9=B8=BF=E8=92=99?=
=?UTF-8?q?=E5=85=83=E6=9C=8D=E5=8A=A1=E7=AB=AF=E5=B0=8F=E7=A8=8B=E5=BA=8F?=
=?UTF-8?q?=E9=80=82=E9=85=8D=E4=BC=98=E5=8C=96?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
1. 修复cart页面unload时调用不存在方法的报错
2. 适配鸿蒙themeColor绑定和$nextTick兼容问题
3. 给多处逻辑添加try/catch防止页面空白
4. 补全v-for循环的key属性
---
common/js/goods_detail_base.js | 200 ++++++++++++++++----------------
components-diy/diy-category.vue | 4 +-
components/ns-form/ns-form.vue | 2 +-
pages_goods/detail.vue | 4 +-
pages_goods/public/js/cart.js | 4 +-
pages_goods/public/js/detail.js | 38 ++++--
6 files changed, 138 insertions(+), 114 deletions(-)
diff --git a/common/js/goods_detail_base.js b/common/js/goods_detail_base.js
index fafe255..e634676 100644
--- a/common/js/goods_detail_base.js
+++ b/common/js/goods_detail_base.js
@@ -80,117 +80,119 @@ export default {
methods: {
// 处理商品详情数据
async handleGoodsSkuData() {
- // this.navbarData.title = this.goodsSkuDetail.goods_name.length > 9 ? this.goodsSkuDetail.goods_name.substr(0, 9) + "..." : this.goodsSkuDetail.goods_name;
- //设置标题
- // this.$langConfig.title(this.navbarData.title);
- if (this.goodsSkuDetail.config) {
- this.navbarData.navBarSwitch = this.goodsSkuDetail.config.nav_bar_switch;
- }
-
- this.whetherCollection = this.goodsSkuDetail.is_collect; // 用户关注商品状态
-
- this.modifyGoodsInfo();
-
- // 初始化商品详情视图数据
- if (this.$refs.goodsDetailView) this.$refs.goodsDetailView.init({
- sku_id: this.skuId,
- goods_id: this.goodsSkuDetail.goods_id,
- preview: this.preview,
- source_member: this.source_member,
- posterParams: this.posterParams,
- posterApi: this.posterApi,
- shareUrl: this.shareUrl,
- goodsRoute: this.goodsRoute,
- isVirtual: this.goodsSkuDetail.is_virtual,
- deliveryType: this.goodsSkuDetail.express_type,
- whetherCollection: this.goodsSkuDetail.is_collect,
- evaluateConfig: this.goodsSkuDetail.evaluate_config,
- evaluateList: this.goodsSkuDetail.evaluate_list,
- evaluateCount: this.goodsSkuDetail.evaluate_count
- });
-
- //媒体
- if (this.goodsSkuDetail.video_url) this.switchMedia = "video";
-
- if (!Array.isArray(this.goodsSkuDetail.sku_images)) {
- if (this.goodsSkuDetail.sku_images) this.goodsSkuDetail.sku_images = this.goodsSkuDetail.sku_images.split(",");
- else this.goodsSkuDetail.sku_images = [];
- }
-
- // 多规格时合并主图
- if (this.goodsSkuDetail.goods_spec_format && this.goodsSkuDetail.goods_image) {
-
- if (!Array.isArray(this.goodsSkuDetail.goods_image)) this.goodsSkuDetail.goods_image = this.goodsSkuDetail.goods_image.split(",");
-
- this.goodsSkuDetail.sku_images = this.goodsSkuDetail.goods_image.concat(this.goodsSkuDetail.sku_images);
- }
-
- let maxHeight = '';
- let systemInfo = uni.getSystemInfoSync();
- this.goodsSkuDetail.goods_image_list.forEach((item, index) => {
- if (typeof item.pic_spec == "string")
- item.pic_spec = item.pic_spec.split('*');
-
- let ratio = item.pic_spec[0] / systemInfo.windowWidth;
- item.pic_spec[0] = item.pic_spec[0] / ratio;
- item.pic_spec[1] = item.pic_spec[1] / ratio;
-
- if (!maxHeight || maxHeight > item.pic_spec[1]) {
- maxHeight = item.pic_spec[1];
+ // 鸿蒙兼容: 外层包 try/catch, 任何同步抛错都不会导致 page 整体空白
+ try {
+ if (this.goodsSkuDetail.config) {
+ this.navbarData.navBarSwitch = this.goodsSkuDetail.config.nav_bar_switch;
}
- });
- this.goodsSkuDetail.swiperHeight = maxHeight + 'px';
- this.goodsSkuDetail.unit = this.goodsSkuDetail.unit || this.$lang('unit.piece');
+ this.whetherCollection = this.goodsSkuDetail.is_collect; // 用户关注商品状态
- // 当前商品SKU规格
- if (this.goodsSkuDetail.sku_spec_format) this.goodsSkuDetail.sku_spec_format = JSON.parse(this.goodsSkuDetail.sku_spec_format);
+ this.modifyGoodsInfo();
- // 商品属性
- if (this.goodsSkuDetail.goods_attr_format) {
- let goods_attr_format = JSON.parse(this.goodsSkuDetail.goods_attr_format);
- this.goodsSkuDetail.goods_attr_format = this.$util.unique(goods_attr_format, "attr_id");
- for (var i = 0; i < this.goodsSkuDetail.goods_attr_format.length; i++) {
- for (var j = 0; j < goods_attr_format.length; j++) {
- if (this.goodsSkuDetail.goods_attr_format[i].attr_id == goods_attr_format[j].attr_id && this.goodsSkuDetail.goods_attr_format[i].attr_value_id != goods_attr_format[j].attr_value_id) {
- this.goodsSkuDetail.goods_attr_format[i].attr_value_name += "、" + goods_attr_format[j].attr_value_name;
+ // 初始化商品详情视图数据
+ if (this.$refs.goodsDetailView) this.$refs.goodsDetailView.init({
+ sku_id: this.skuId,
+ goods_id: this.goodsSkuDetail.goods_id,
+ preview: this.preview,
+ source_member: this.source_member,
+ posterParams: this.posterParams,
+ posterApi: this.posterApi,
+ shareUrl: this.shareUrl,
+ goodsRoute: this.goodsRoute,
+ isVirtual: this.goodsSkuDetail.is_virtual,
+ deliveryType: this.goodsSkuDetail.express_type,
+ whetherCollection: this.goodsSkuDetail.is_collect,
+ evaluateConfig: this.goodsSkuDetail.evaluate_config,
+ evaluateList: this.goodsSkuDetail.evaluate_list,
+ evaluateCount: this.goodsSkuDetail.evaluate_count
+ });
+
+ //媒体
+ if (this.goodsSkuDetail.video_url) this.switchMedia = "video";
+
+ if (!Array.isArray(this.goodsSkuDetail.sku_images)) {
+ if (this.goodsSkuDetail.sku_images) this.goodsSkuDetail.sku_images = this.goodsSkuDetail.sku_images.split(",");
+ else this.goodsSkuDetail.sku_images = [];
+ }
+
+ // 多规格时合并主图
+ if (this.goodsSkuDetail.goods_spec_format && this.goodsSkuDetail.goods_image) {
+
+ if (!Array.isArray(this.goodsSkuDetail.goods_image)) this.goodsSkuDetail.goods_image = this.goodsSkuDetail.goods_image.split(",");
+
+ this.goodsSkuDetail.sku_images = this.goodsSkuDetail.goods_image.concat(this.goodsSkuDetail.sku_images);
+ }
+
+ let maxHeight = '';
+ let systemInfo = uni.getSystemInfoSync();
+ this.goodsSkuDetail.goods_image_list.forEach((item, index) => {
+ if (typeof item.pic_spec == "string")
+ item.pic_spec = item.pic_spec.split('*');
+
+ let ratio = item.pic_spec[0] / systemInfo.windowWidth;
+ item.pic_spec[0] = item.pic_spec[0] / ratio;
+ item.pic_spec[1] = item.pic_spec[1] / ratio;
+
+ if (!maxHeight || maxHeight > item.pic_spec[1]) {
+ maxHeight = item.pic_spec[1];
+ }
+ });
+ this.goodsSkuDetail.swiperHeight = maxHeight + 'px';
+
+ this.goodsSkuDetail.unit = this.goodsSkuDetail.unit || this.$lang('unit.piece');
+
+ // 当前商品SKU规格
+ if (this.goodsSkuDetail.sku_spec_format) this.goodsSkuDetail.sku_spec_format = JSON.parse(this.goodsSkuDetail.sku_spec_format);
+
+ // 商品属性
+ if (this.goodsSkuDetail.goods_attr_format) {
+ let goods_attr_format = JSON.parse(this.goodsSkuDetail.goods_attr_format);
+ this.goodsSkuDetail.goods_attr_format = this.$util.unique(goods_attr_format, "attr_id");
+ for (var i = 0; i < this.goodsSkuDetail.goods_attr_format.length; i++) {
+ for (var j = 0; j < goods_attr_format.length; j++) {
+ if (this.goodsSkuDetail.goods_attr_format[i].attr_id == goods_attr_format[j].attr_id && this.goodsSkuDetail.goods_attr_format[i].attr_value_id != goods_attr_format[j].attr_value_id) {
+ this.goodsSkuDetail.goods_attr_format[i].attr_value_name += "、" + goods_attr_format[j].attr_value_name;
+ }
}
}
}
- }
- // 商品SKU格式
- if (this.goodsSkuDetail.goods_spec_format) this.goodsSkuDetail.goods_spec_format = JSON.parse(this.goodsSkuDetail.goods_spec_format);
+ // 商品SKU格式
+ if (this.goodsSkuDetail.goods_spec_format) this.goodsSkuDetail.goods_spec_format = JSON.parse(this.goodsSkuDetail.goods_spec_format);
- // 商品详情
- if (this.goodsSkuDetail.goods_content) this.goodsSkuDetail.goods_content = (this.goodsSkuDetail.goods_content);
- // if (this.goodsSkuDetail.goods_content) this.goodsSkuDetail.goods_content = htmlParser(this.goodsSkuDetail.goods_content);
+ // 商品详情
+ if (this.goodsSkuDetail.goods_content) this.goodsSkuDetail.goods_content = (this.goodsSkuDetail.goods_content);
+ // if (this.goodsSkuDetail.goods_content) this.goodsSkuDetail.goods_content = htmlParser(this.goodsSkuDetail.goods_content);
- //商品服务
- if (this.goodsSkuDetail.goods_service) {
- for (let i in this.goodsSkuDetail.goods_service) {
- this.goodsSkuDetail.goods_service[i]['icon'] = this.goodsSkuDetail.goods_service[i]['icon'] ? JSON.parse(this.goodsSkuDetail.goods_service[i]['icon']) : '';
+ //商品服务
+ if (this.goodsSkuDetail.goods_service) {
+ for (let i in this.goodsSkuDetail.goods_service) {
+ this.goodsSkuDetail.goods_service[i]['icon'] = this.goodsSkuDetail.goods_service[i]['icon'] ? JSON.parse(this.goodsSkuDetail.goods_service[i]['icon']) : '';
+ }
}
+
+ this.contactData = {
+ title: this.goodsSkuDetail.sku_name,
+ path: this.shareUrl,
+ img: this.$util.img(this.goodsSkuDetail.sku_image, {
+ size: 'big'
+ })
+ };
+ if (this.$refs.goodsPromotion) this.$refs.goodsPromotion.refresh(this.goodsSkuDetail.goods_promotion);
+
+ if (this.goodsRoute != '/pages_goods/detail') this.setPublicShare();
+
+ // this.getBarrageData();
+ // 性能优化: 商品表单(留言表单)仅在商品详情打开"立即留言"弹窗时才需要,
+ // 不再阻塞首次渲染。改为在后台并发请求, 用户真正打开弹窗时数据已就绪。
+ // 注意: 不再依赖 addonIsExist.form (后端可能未开启 form 插件, 但产品被设为"留言商品"(isinformation=2)
+ // 仍需展示留言表单), 始终尝试加载, getGoodsForm 内部已对失败分支兜底空数组。
+ this._goodsFormPromise = this.getGoodsForm();
+ // 不 await, 释放主流程; 调用方需要时可 await this._goodsFormPromise
+ } catch (e) {
+ console.error('handleGoodsSkuData failed:', e);
}
-
- this.contactData = {
- title: this.goodsSkuDetail.sku_name,
- path: this.shareUrl,
- img: this.$util.img(this.goodsSkuDetail.sku_image, {
- size: 'big'
- })
- };
- if (this.$refs.goodsPromotion) this.$refs.goodsPromotion.refresh(this.goodsSkuDetail.goods_promotion);
-
- if (this.goodsRoute != '/pages_goods/detail') this.setPublicShare();
-
- // this.getBarrageData();
- // 性能优化: 商品表单(留言表单)仅在商品详情打开"立即留言"弹窗时才需要,
- // 不再阻塞首次渲染。改为在后台并发请求, 用户真正打开弹窗时数据已就绪。
- // 注意: 不再依赖 addonIsExist.form (后端可能未开启 form 插件, 但产品被设为"留言商品"(isinformation=2)
- // 仍需展示留言表单), 始终尝试加载, getGoodsForm 内部已对失败分支兜底空数组。
- this._goodsFormPromise = this.getGoodsForm();
- // 不 await, 释放主流程; 调用方需要时可 await this._goodsFormPromise
},
/**
* 刷新商品详情数据
diff --git a/components-diy/diy-category.vue b/components-diy/diy-category.vue
index b3db41b..f4af85f 100644
--- a/components-diy/diy-category.vue
+++ b/components-diy/diy-category.vue
@@ -170,8 +170,8 @@
-->
-
+
diff --git a/components/ns-form/ns-form.vue b/components/ns-form/ns-form.vue
index aff63e7..8738d3f 100644
--- a/components/ns-form/ns-form.vue
+++ b/components/ns-form/ns-form.vue
@@ -1,6 +1,6 @@
-
+
diff --git a/pages_goods/detail.vue b/pages_goods/detail.vue
index b7187c4..de47cf5 100644
--- a/pages_goods/detail.vue
+++ b/pages_goods/detail.vue
@@ -1,5 +1,7 @@
-
+
+